繁体   English   中英

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

[英]Invalid token while running aws S3 cli command on AWS Lambda function

我附加了一个 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.

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Test0",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname.com/*",
                "arn:aws:s3:::bucketname.com"
            ]
        }
    ]
}

我已经尝试按照另一个 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>...

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

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

文档中提到了一条说明,内容如下:

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

此处需要注意的关键是角色 ARN 已转换为我们通常不会在控制台中看到的唯一委托人 ID (ID)。 有一个反向转换回资源的 ARN。 当角色被删除并重新创建时,角色有一个新的 ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM