![](/img/trans.png)
[英]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.