python загрузка на S3 без учетных данных - PullRequest
1 голос
/ 19 февраля 2020

У меня есть корзина S3, которая имеет следующую политику, разрешающую полный доступ от указанных c IP

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicWriteFromIP",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::logs-dev",
                "arn:aws:s3:::logs-dev/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "#.#.#.#/32"
                }
            }
        }
    ]
}

Я хочу загрузить файл в корзину S3 без каких-либо учетных данных, используя python. Когда я попытался использовать boto / boto3 с пустым env AWS_ACCESS_KEY_ID='' & AWS_SECRET_ACCESS_KEY='', я получил следующую ошибку

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/boto3/s3/inject.py", line 209, in bucket_upload_file
    ExtraArgs=ExtraArgs, Callback=Callback, Config=Config)
  File "/usr/local/lib/python2.7/site-packages/boto3/s3/inject.py", line 131, in upload_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/site-packages/boto3/s3/transfer.py", line 279, in upload_file
    future.result()
  File "/usr/local/lib/python2.7/site-packages/s3transfer/futures.py", line 106, in result
    return self._coordinator.result()
  File "/usr/local/lib/python2.7/site-packages/s3transfer/futures.py", line 265, in result
    raise self._exception
botocore.exceptions.NoCredentialsError: Unable to locate credentials

Как я могу загрузить файлы в корзину S3 без учетных данных? Можно ли просто использовать urllib2 для загрузки файла в S3 (publi c)?

1 Ответ

0 голосов
/ 20 февраля 2020

Мне пришлось включить Static Web hosting и установить Block all public access на выкл

Тогда следующий код работал

import requests
url = "https://logs-dev.s3-us-east-1.amazonaws.com/"
data = { 'key': '/test.txt' }
files = { 'file': open('/tmp/test.txt', 'rb') }
r = requests.post(url, data=data, files=files)
print "status %s" % r.status_code
...