簡體   English   中英

使用 IAM 角色時的 AWS boto3 InvalidAccessKeyId

[英]AWS boto3 InvalidAccessKeyId when using IAM role

我使用預先簽名的帖子/網址上傳到 S3 並從 S3 下載。 預簽名的 url/post 使用 Lambda function 中的 boto3 生成(它與 zappa 一起部署)。

當我添加我的AWS_SECRET_ACCESS_KEYAWS_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM