标签: boto3

boto3 客户端错误:使用客户提供的密钥进行的服务器端加密与指定的加密方法不兼容

我在 django 应用程序中使用 boto3 将一些文件上传到 S3。但是当我尝试使用boto3 的 Object's API指定客户端加密算法和密钥时收到以下错误。

调用 PutObject 操作时发生错误 (InvalidArgument):使用客户提供的密钥的服务器端加密与指定的加密方法不兼容。

这是我指定加密算法和密钥的代码。

    import boto3
    s3 = boto3.resource('s3')
    key = s3.Object(bucket_name, key_name)
    file_obj.seek(0)
    kwargs = {
        'ServerSideEncryption': 'AES256',
        'SSECustomerAlgorithm': 'AES256',
        'SSECustomerKey': settings.AWS_ENCRYPTION_KEY,
    }

    key.put(**kwargs)
    key.put(Body=file_obj)
    key.Acl().put(ACL='public-read')
Run Code Online (Sandbox Code Playgroud)

这是我在 settings.py 中生成加密密钥的方法

# settings.py
password = '32characterslongpassphraseneeded'.encode('utf-8')
AWS_ENCRYPTION_KEY = base64.b64encode(password)
Run Code Online (Sandbox Code Playgroud)

更新

我正在使用python3。

python encryption django amazon-s3 boto3

0
推荐指数
1
解决办法
7165
查看次数

如何使用 boto3 遍历 S3 存储桶?

我正在尝试训练一个神经网络,我在其中传递一系列图像。我想创建一个生成器,将每个图像作为 numpy 数组传入

from skimage import io
image_array = io.imread(url)
Run Code Online (Sandbox Code Playgroud)

但这仅适用于特定的亚马逊 aws 网址。我知道使用 boto 库的标准方法是这样的:

s3 = boto3.resource('s3')
s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt') 
Run Code Online (Sandbox Code Playgroud)

但是再次在这里,您似乎指向特定资源

我想要这样的东西:

def my_generator():
    for object in s3_bucket():     # does an s3_bucket() iterator like this exist?
        image_array = io.imread(object)
        yield image_array
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

python amazon-s3 boto amazon-web-services boto3

0
推荐指数
1
解决办法
6617
查看次数

boto3等效于收集所有AWS安全组

使用旧版本的boto,您可以使用以下命令将所有安全组拉到aws帐户中:

import boto.ec2
conn = boto3.connect_to_region("us-east-1")
groups = conn.get_all_security_groups()
Run Code Online (Sandbox Code Playgroud)

但是,对于boto3,文档尚不清楚如何执行相同的操作。这里有许多参考资料涉及使用新的boto3软件包更改策略的内容,但没有列出所有安全组和策略的机制。

此操作是否有新方法?

amazon-web-services aws-sdk boto3

0
推荐指数
1
解决办法
4216
查看次数

使用 Boto3 启动多个 EC2 实例

我正在使用下面的代码获取实例列表

    def list_instances_by_tag_value(self, tagkey, tagvalue):
    ec2client = boto3.client('ec2')
    response = ec2client.describe_instances(
        Filters=[
            {
                'Name': 'tag:'+tagkey,
                'Values': [tagvalue]
            }
        ]
    )
    instancelist = []
    for reservation in (response["Reservations"]):
        for instance in reservation["Instances"]:
            instancelist.append(instance["InstanceId"])
    return instancelist
Run Code Online (Sandbox Code Playgroud)

现在该方法list_instances_by_tag_value返回一个List. 现在我需要开始EC2 instances. 所以我正在做类似下面的事情

def start_ec_instances(self, instanceids):
    response = ec2client.start_instances(InstanceIds=instanceids)
    return
Run Code Online (Sandbox Code Playgroud)

instanceids从第一个方法返回的列表在哪里。但是ec2client.start_instances只接受String而不是List.

我知道我可以将其转换listString然后解析它。我需要在 instanceID 前面附加 (') 并在每个实例 ID 之间附加逗号 (,)。

问题是,有没有什么简单的方法可以做到这一点,而不是将列表转换为字符串并执行一些append操作?

它需要看起来像 'i-XXXXXX', 'i-XXXXX', 'i-XXXXXXX'

编辑:当我将列表传递给start_instances …

python amazon-ec2 amazon-web-services boto3

0
推荐指数
1
解决办法
1065
查看次数

解析boto3输出JSON

我正在使用此代码来获取IAM用户:

    #!/usr/bin/env python


    import boto3
    import json


    client = boto3.client('iam')

    response = client.list_users(

    )

    print response
Run Code Online (Sandbox Code Playgroud)

得到:

{u'Users': [{u'UserName': 'ja', u'Path': '/', u'CreateDate': datetime.datetime(2018, 4, 6, 12, 41, 18, tzinfo=tzutc()), u'UserId': 'AIDAJXIHXCSI62ZQKLGZM', u'Arn': 'arn:aws:iam::233135199200:user/ja'}, {u'UserName': 'test', u'Path': '/', u'CreateDate': datetime.datetime(2018, 4, 7, 10, 55, 58, tzinfo=tzutc()), u'UserId': 'AIDAIENHQD6YWMX3A45TY', u'Arn': 'arn:aws:iam::233135199200:user/test'}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'ebd600f0-3a52-11e8-bc50-d37153ae8ac5', 'HTTPHeaders': {'x-amzn-requestid': 'ebd600f0-3a52-11e8-bc50-d37153ae8ac5', 'date': 'Sat, 07 Apr 2018 11:00:44 GMT', 'content-length': '785', 'content-type': 'text/xml'}}, u'IsTruncated': False}
Run Code Online (Sandbox Code Playgroud)

我保存了对JSON文件的响应

我只需要提取用户名,以便在这种情况下输出应为2行:

ja
test
Run Code Online (Sandbox Code Playgroud)

添加时

print response['Users'][0]['UserName'] …
Run Code Online (Sandbox Code Playgroud)

python json amazon-web-services amazon-iam boto3

0
推荐指数
1
解决办法
2553
查看次数

批量生成预签名URL boto3

我目前正在使用以下内容为存储桶资源创建预先签名的URL:

bucket_name = ...
key = ...
s3_client = ...

s3_client.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": bucket_name,
        "Key": key
    },
    ExpiresIn=100
)
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我想知道是否可以在一个请求中为多个密钥生成预先签名的URL?或者是否需要为每个密钥发出一个请求?我没有在有关此主题的文档中找到任何有用的内容.我正在寻找这样的东西:

bucket_name = ...
keys = [...]
s3_client = ...

# Returns an array of pre-signed urls, in the same order as `keys`
s3_client.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": bucket_name,
        "Keys": keys
    },
    ExpiresIn=100
)
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-web-services boto3

0
推荐指数
1
解决办法
331
查看次数

Boto3 - sqs get_queue_url 结果在 QueueDoesNotExist

我正在尝试从 SQS 队列中读取。为此,我需要获取队列 url。这是我的代码

    sts = boto3.client('sts')
    print('running as:')
    pp.pprint(sts.get_caller_identity())

    sqs = boto3.client('sqs')
    queue_name = settings.SQS_JOBS_TASK_RESULTS_QUEUE
    print('getting queue_name: ', queue_name)
    res = sqs.get_queue_url(QueueName=queue_name)
Run Code Online (Sandbox Code Playgroud)

从上面的代码你可以看到我也在验证我的身份。

sqs.get_queue_url 总是失败

botocore.errorfactory.QueueDoesNotExist:调用 GetQueueUrl 操作时发生错误 (AWS.SimpleQueueService.NonExistentQueue):指定的队列不存在或您无权访问它。

我已经从 aws Web 控制台复制粘贴了队列名称。仍然失败。

我知道我的权限没问题,因为如果我跳过这一步,从 web 控制台复制粘贴 url 并直接跳转到读取和写入队列,它可以工作。

我在这里缺少什么?

amazon-sqs boto3

0
推荐指数
1
解决办法
4686
查看次数

Amazon SQS 消息消失了

我有一个 Amazon SQS 队列和一个死信队列。

我的 python 程序从 SQS 队列获取一条消息,然后,如果它引发异常,它会将消息发送到死信队列。

现在我有一个程序可以检查死信队列是否仍然可以处理这些消息。如果是,它将被发送回主 SQS 队列。你看,我在这里期望的是在我的测试中出现各种无限循环,但显然,该消息在 2 次尝试后消失。为什么会这样?

当我在消息中添加一个额外的字段(这是随机值)时,它会以某种方式执行我的期望(来回发送的无限循环)。SQS 中是否有一种机制可以阻止我在消息相同时执行的操作?

def handle_retrieved_messages(self):
    if not self._messages:
        return None

    for message in self._messages:
        try:
            logger.info(
                "Processing Dead Letter message: {}".format(
                    message.get("Body")
                )
            )
            message_body = self._convert_json_to_dict(message.get("Body"))
            reprocessed = self._process_message(
                message_body, None, message_body
            )
        except Exception as e:
            logger.exception(
                "Failed to process the following SQS message:\n"
                "Message Body: {}\n"
                "Error: {}".format(message.get("Body", "<empty body>"), e)
            )
            # Send to error queue
            self._delete_message(message)
            self._sqs_sender.send_message(message_body)
        else:
            self._delete_message(message)
            if not reprocessed: …
Run Code Online (Sandbox Code Playgroud)

amazon-sqs amazon-web-services dead-letter boto3

0
推荐指数
1
解决办法
3307
查看次数

带有 boto3 的 DynamoDB - 限制充当页面大小

根据 boto3 docslimit参数 inquery允许您限制DynamoDB 表/GSI 中评估对象的数量。

但是,LastEvaluatedKey当达到所需的限制时不会返回,因此想要限制获取的结果数量的客户端将无法这样做

考虑以下代码:

        while True:
            query_result = self._dynamodb_client.query(**query_kwargs)
            for dynamodb_formatted_item in query_result["Items"]:
                yield self._convert_dict_from_dynamodb_key_names(
                    from_dynamodb_formatted_dict_to_dict(dynamodb_formatted_item)
                )

            if "LastEvaluatedKey" not in query_result:
                return
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?这是 Boto 库中的错误吗?

python amazon-dynamodb boto3

0
推荐指数
1
解决办法
3336
查看次数

使用通配符获取所有 RDS 实例的 AWS Cloudwatch 指标

出于某些警报和监控目的,我正在尝试获取 RDS cloudwatch 指标。大约有 50 个 RDS 实例,并且希望在一个 API 调用中获取所有这些实例的指标(我使用的是 boto3)。这是我的代码:

response = cloudwatch_client.get_metric_data(
    MetricDataQueries=[
        {
            'Id': 'fetching_data_for_something',
            'MetricStat': {
                'Metric': {
                    'Namespace': 'AWS/RDS',
                    'MetricName': 'FreeStorageSpace',
                    'Dimensions': [
                        {
                            'Name': 'DBInstanceIdentifier',
                            'Value': '*'
                        },
                    ]
                },
                'Period': 300,
                'Stat': 'Average'
            },
            'ReturnData': True
        },
    ],
    StartTime=datetime(2019, 6, 11,13,0,0),
    EndTime=datetime(2019, 6, 11,13,20,00),
    ScanBy='TimestampDescending',
    MaxDatapoints=123
) 
Run Code Online (Sandbox Code Playgroud)

但这返回一个空结果,但是当我搜索特定的数据库实例时,它返回结果。这是工作:

'Dimensions': [
{
    'Name': 'DBInstanceIdentifier',
    'Value': 'name_of_db'
},
]
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

'Dimensions': [
{
    'Name': 'DBInstanceIdentifier',
    'Value': '*'
},
]
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?一次获取所有数据库的指标?

amazon-web-services amazon-rds amazon-cloudwatch boto3 amazon-cloudwatch-metrics

0
推荐指数
1
解决办法
1257
查看次数