在 AWS Lambda 函数上运行 aws S3 cli 命令时令牌无效

Eli*_*les 3 amazon-s3 amazon-web-services amazon-iam aws-lambda

我附加了一个 lambda 函数,在其中运行命令aws ls s3://bucketname.com,该函数失败并出现错误:

botocore.exceptions.ClientError: An error occurred (InvalidToken) when calling the ListObjectsV2 operation: The provided token is malformed or otherwise invalid.
Run Code Online (Sandbox Code Playgroud)

我一直在努力找出问题所在,这看起来像是权限问题吗?然而,附加的 IAM 角色有一个内联策略,本质上允许一切:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Test0",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname.com/*",
                "arn:aws:s3:::bucketname.com"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试按照另一个 SO 问题中的建议aws --region eu-west-3 s3 ls s3://bucketname.com在命令 ( )中指定区域,但我仍然遇到相同的错误。

编辑:如果我添加选项--debug,我会看到:

2019-11-26 11:46:48,292 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=ListObjectsV2) with params: {'url_path': '/bucketname.com?list-type=2', 'query_string': {'prefix': '', 'delimiter': '/', 'encoding-type': 'url'}, 'method': 'GET', 'headers': {'User-Agent': 'aws-cli/1.16.291 Python/3.7.5 Linux/4.14.138-99.102.amzn2.x86_64 exec-env/AWS_Lambda_python3.7 botocore/1.13.27'}, 'body': b'', 'url': 'https://s3.eu-west-3.amazonaws.com/bucketname.com?list-type=2&prefix=&delimiter=%2F&encoding-type=url', 'context': {'client_region': 'eu-west-3', 'client_config': <botocore.config.Config object at 0x7fc7e6670e10>, 'has_streaming_input': False, 'auth_type': None, 'encoding_type_auto_set': True, 'signing': {'bucket': 'bucketname.com'}}}
.. removed for conciseness..
2019-11-26 11:46:48,294 - MainThread - botocore.endpoint - DEBUG - Sending http request: <AWSPreparedRequest stream_output=False, method=GET, url=https://s3.eu-west-3.amazonaws.com/bucketname.com?list-type=2&prefix=&delimiter=%2F&encoding-type=url, headers={'User-Agent': b'aws-cli/1.16.291 Python/3.7.5 Linux/4.14.138-99.102.amzn2.x86_64 exec-env/AWS_Lambda_python3.7 botocore/1.13.27', 'X-Amz-Date': b'20191126T114648Z', 'X-Amz-Security-Token': b'REMOVED', 'X-Amz-Content-SHA256': b'REMOVED', 'Authorization': b'AWS4-HMAC-SHA256 Credential=REMOVED/eu-west-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=REMOVED'}>
..removed for conciseness..
2019-11-26 11:46:48,312 - MainThread - botocore.parsers - DEBUG - Response body:
b'<?xml version="1.0" encoding="UTF-8"?>\n<Error><Code>InvalidToken</Code><Message>The provided token is malformed or otherwise invalid.</Message>...
Run Code Online (Sandbox Code Playgroud)

关于可能出什么问题的任何想法吗?

kri*_*004 5

如果删除并重新创建附加到 Lambda 函数的 IAM 角色,Lambda 函数将显示该角色已附加。但是,Lambda 函数将不起作用。这种情况下的解决方案是将不同的 IAM 角色附加到 Lambda,然后重新附加旧角色。请参阅文档了解更多详细信息。

文件中提到了一条注释,其中指出了以下内容:

如果角色信任策略中的委托人元素包含指向特定 IAM 角色的 ARN,则在保存策略时,该 ARN 将转换为该角色的唯一委托人 ID。这有助于降低某人通过删除并重新创建角色来升级权限的风险。您通常不会在控制台中看到此 ID,因为显示信任策略时还会反向转换回角色的 ARN。但是,如果删除角色,关系就会中断。即使您重新创建角色,该策略也不再适用,因为新角色的新主体 ID 与信任策略中存储的 ID 不匹配。发生这种情况时,委托人 ID 会显示在控制台中,因为 AWS 无法再将其映射回有效的 ARN。最终结果是,如果您删除并重新创建信任策略的主体元素中引用的角色,则必须编辑该角色以将现在不正确的主体 ID 替换为正确的 ARN。当您保存策略时,ARN 将再次转换为角色的新主体 ID。

这里需要注意的关键是角色 ARN 被转换为一个唯一的主体 ID,我们通常在控制台中看不到它 (ID)。有一个反向转换回资源的 ARN。当角色被删除并重新创建时,该角色将具有新的 ID。