我在 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。
我正在尝试训练一个神经网络,我在其中传递一系列图像。我想创建一个生成器,将每个图像作为 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)
我怎么能这样做?
使用旧版本的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软件包更改策略的内容,但没有列出所有安全组和策略的机制。
此操作是否有新方法?
我正在使用下面的代码获取实例列表
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.
我知道我可以将其转换list为String然后解析它。我需要在 instanceID 前面附加 (') 并在每个实例 ID 之间附加逗号 (,)。
问题是,有没有什么简单的方法可以做到这一点,而不是将列表转换为字符串并执行一些append操作?
它需要看起来像 'i-XXXXXX', 'i-XXXXX', 'i-XXXXXXX'
编辑:当我将列表传递给start_instances …
我正在使用此代码来获取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) 我目前正在使用以下内容为存储桶资源创建预先签名的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) 我正在尝试从 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 队列和一个死信队列。
我的 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) 根据 boto3 docs,limit参数 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 库中的错误吗?
出于某些警报和监控目的,我正在尝试获取 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
boto3 ×10
python ×6
amazon-s3 ×3
amazon-sqs ×2
amazon-ec2 ×1
amazon-iam ×1
amazon-rds ×1
aws-sdk ×1
boto ×1
dead-letter ×1
django ×1
encryption ×1
json ×1