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

时间:2019-11-26 11:49:40

标签: amazon-web-services amazon-s3 aws-lambda amazon-iam

我附加了一个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"
            ]
        }
    ]
}

我已经尝试在命令(aws --region eu-west-3 s3 ls s3://bucketname.comas suggested in another SO question中指定区域,但是仍然出现相同的错误。

编辑:如果我添加选项--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>...

有什么想法可能会出问题吗?

1 个答案:

答案 0 :(得分:4)

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

文档中有一条注释指出以下内容:

  

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

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