【发布时间】:2020-08-21 22:42:36
【问题描述】:
我们结合使用云形成和 terraform,其中一些常见资源(如 DynamoDB、S3)是使用 terraform 创建的,而其他资源(如 APIGateway)则使用无服务器和 cloudformation 创建。所有资源都在同一个 AWS 账户中
我在 terraform 中有一个 S3 存储桶
resource "aws_s3_bucket" "payment_bucket" {
bucket = "payment-bucket-${var.env_name}"
acl = "private"
tags = merge(
module.tags.base_tags,
{
"Name" = "payment-bucket-${var.env_name}"
}
)
lifecycle {
ignore_changes = [tags]
}
}
当我运行 tf-apply 时,这会在我的 AWS 账户中创建一个私有存储桶 payment-bucket-dev
我们在同一个 AWS 账户中有一个 APIGateway,该账户是使用无服务器创建的,其中一个 lambda 需要访问此存储桶,因此我为 lambda 函数创建了一个 IAM 角色,以授予访问该存储桶的权限。
makePayment:
name: makePayment-${self:provider.stage}
handler: src/handler/makePayment.default
events:
- http:
path: /payment
method: post
private: true
cors: true
iamRoleStatementsName: ${self:service}-${self:provider.stage}-makePayment-role
iamRoleStatements:
- Effect: Allow
Action:
- s3:PutObject
Resource:
- arn:aws:s3:::#{AWS::Region}:#{AWS::AccountId}:payment-bucket-${self:provider.stage}/capture/batch/*
但是当我运行这个 lambda make-payment-dev 时,它会引发 AccessDenied 错误,除非我添加存储桶策略来授予对 lambda 角色的访问权限
resource "aws_s3_bucket_policy" "payment_service_s3_bucket_policy" {
..
..
}
当 s3 存储桶和 lambda 函数和角色在同一个账户时,为什么我需要添加 S3 存储桶策略?我错过了什么吗?
另外,如果我使用 AWS::S3::Bucket 创建存储桶作为 Apigateway 所在的云形成堆栈的一部分(我们使用的是无服务器),我不需要添加存储桶策略并且一切正常。
【问题讨论】:
-
S3 存储桶 ARN 中没有账户 ID 或区域。使用
arn:aws:s3:::mybucket/myprefix/*。 -
谢谢!这解决了问题。
标签: amazon-web-services amazon-s3 aws-lambda terraform aws-api-gateway