因此,我有一个 Lambda,它具有 IAM 角色,允许从特定 S3 存储桶进行读写访问。我正在触发
textract:DetectDocumentText
,它从这些存储桶之一读取数据。我想限制 Textract 只能访问此存储桶。我知道 Textract 没有 ServiceLinked 角色。是否有办法将 Textract 权限限制为仅此存储桶,或者它是否从 Lambda“继承”存储桶权限?
{
"Effect": "Allow",
"Action": [
"textract:DetectDocumentText"
],
"Resource": [
"*"
]
},
{
"Sid": "AllS3",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-foot-bucket"
]
}
由于 Textract 使用调用者的权限(在您的例子中是 Lambda 的执行角色),这并不简单。如果 Lambda 需要访问多个存储桶,我们无法使用相同的角色也进行 Textract 调用。
您可以做的是创建另一个角色
TextractAccessor
,该角色有权执行 Textract 操作,并且还可以访问 Textract 可能使用的 S3 存储桶。
{
"Effect": "Allow",
"Action": [
"textract:DetectDocumentText"
],
"Resource": [
"*"
]
},
{
"Sid": "SingleS3Bucket",
"Effect": "Allow",
"Action": [
"s3:*Object"
],
"Resource": [
"arn:aws:s3:::<textract-only-bucket>"
]
}
您可以授予 Lambda 执行角色权限以在
sts:AssumeRole
上调用 TextractAccessor
。然后,在您的代码中,您将承担 TextractAccessor
角色并使用 STS 返回的凭据(您可以缓存这些凭据)对 Textract 进行 API 调用。这有点烦人,但这种方式可以清楚地隔离 Textract 和 Lambda 函数其余部分之间的权限。