[英]IAM Permissions Errors When Using boto3 for AWS Comprehend
[英]AWS boto3 InvalidAccessKeyId when using IAM role
我使用预先签名的帖子/网址上传到 S3 并从 S3 下载。 预签名的 url/post 使用 Lambda function 中的 boto3 生成(它与 zappa 一起部署)。
当我添加我的AWS_SECRET_ACCESS_KEY
和AWS_ACCESS_KEY_ID
作为环境变量时,效果很好。 然后我删除了我的凭证,并将一个 IAM 角色添加到 lambda 以完全访问 S3 存储桶。 After that the lambda return with the presigned URL and getObject
is working well, however when i want to upload object through the URL, it returns an InvalidAccessKeyId
error. 使用的密钥 ID ASIA...
这意味着这些是临时凭证。
好像 lambda 没有使用 IAM 角色,还是有什么问题?
class S3Api:
def __init__(self):
self.s3 = boto3.client(
's3',
region_name='eu-central-1'
)
def generate_store_url(self, key):
return self.s3.generate_presigned_post(FILE_BUCKET,
key,
Fields=None,
Conditions=None,
ExpiresIn=604800)
def generate_get_url(self, key):
return self.s3.generate_presigned_url('get_object',
Params={'Bucket': FILE_BUCKET,
'Key': key},
ExpiresIn=604800)
我的sts:getCallerIdentity
结果:
{
'UserId': '...:dermus-api-dev',
'Account': '....',
'Arn': 'arn:aws:sts::....:assumed-role/dermus-api-dev-ZappaLambdaExecutionRole/dermus-api-dev',
'ResponseMetadata': {
'RequestId': 'a1bd7c31-0199-472e-bff7-b93a4f855450',
'HTTPStatusCode': 200,
'HTTPHeaders': {
'x-amzn-requestid': 'a1bd7c31-0199-472e-bff7-b93a4f855450',
'content-type': 'text/xml',
'content-length': '474',
'date': 'Tue, 09 Mar 2021 08:36:30 GMT'
},
'RetryAttempts': 0
}
}
dermus-api-dev-ZappaLambdaExecutionRole 角色附加到 dermus-api-dev lambda。
预签名 URL 和 Lambda 凭据以一种不明显的方式协同工作。
从文档中,强调我的:
任何拥有有效安全凭证的人都可以创建一个预签名的 URL。 但是,为了成功访问 object,预签名 URL 必须由有权执行预签名 URL 所基于的操作的人创建。
可用于创建预签名 URL 的凭据包括:
IAM 实例配置文件:有效期最长为 6 小时
AWS Security Token Service:使用永久凭证(例如 AWS 账户根用户或 IAM 用户的凭证)签名后,有效期最长为 36 小时
IAM 用户:使用 AWS 签名版本 4 时有效期最长为 7 天
要创建有效期最长为 7 天的预签名 URL,请首先将 IAM 用户凭证(访问密钥和秘密访问密钥)指定给您正在使用的 SDK。 然后,使用 AWS 签名版本 4 生成预签名的 URL。
如果您使用临时令牌创建了预签名的 URL,则 URL 会在令牌到期时到期,即使 URL 是用较晚的到期时间创建的。
底线:如果您等待太久,URL 可能会过期,因为 Lambda 功能凭证已经过期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.