【发布时间】:2018-05-18 02:31:41
【问题描述】:
我正在使用 boto3 为 s3 创建一个预签名的帖子网址。
s3 = boto3.client('s3')
post = s3.generate_presigned_post(
Bucket=bucket_name,
Key=f"{userid}.{suffix}"
)
正在使用的aws_access_key_id是错误的,正确的使用方法之一是通过环境变量添加环境变量。
知道如何使用我在 IAM 中创建的用户定义的 aws 访问密钥强制执行吗?
更新 1
附加到执行 lambda 的 IAM 角色的策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"xray:PutTraceSegments",
"xray:PutTelemetryRecords"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:AttachNetworkInterface",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:DescribeNetworkInterfaces",
"ec2:DetachNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:ResetNetworkInterfaceAttribute"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"kinesis:*"
],
"Resource": "arn:aws:kinesis:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"sns:*"
],
"Resource": "arn:aws:sns:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"sqs:*"
],
"Resource": "arn:aws:sqs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": "arn:aws:dynamodb:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"route53:*"
],
"Resource": "*"
}
]
}
更新 2
【问题讨论】:
-
正确的方法是将正确的 IAM 策略附加到 Lambda 的 IAM 角色。那么您不需要明确指定凭据。
-
@helloV 谢谢。我已附上政策,我错过了什么?
-
角色凭据有一个以
ASIA(不是AKIA)开头的访问密钥ID,并且它会轮换。 “我们的记录中不存在访问密钥”是如果请求缺少随附的x-amz-security-token所引发的错误,该x-amz-security-token为临时访问密钥 ID 赋予了意义。 -
@Michael-sqlbot 但我从哪里可以得到
x-amz-security-token?我想把它作为响应的一部分取回吗? -
它应该自动在环境中为
aws_session_token。
标签: amazon-web-services amazon-s3 aws-lambda boto3 amazon-iam