Мы используем комбинацию формирования облака и терраформирования, при этом некоторые общие ресурсы, такие как DynamoDB, S3, создаются с использованием terraform, а другие, такие как APIGateway, создаются с использованием бессерверной и облачной информации. Все ресурсы находятся в одной учетной записи AWS
У меня есть корзина 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]
}
}
Это создает частную корзину payment-bucket-dev
в моей учетной записи AWS, когда я запускаю tf-apply
У нас есть APIGateway в той же учетной записи AWS, которая создается без сервера, и одной из лямбда-выражений требуется доступ к этому ведру, поэтому я создал роль 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/*
Но когда я запускаю эту лямбда make-payment-dev
, она выдает ошибку AccessDenied, если я не добавлю политику корзины, предоставляющую доступ к лямбда-роли
resource "aws_s3_bucket_policy" "payment_service_s3_bucket_policy" {
..
..
}
Почему Мне нужно добавить политику корзины S3, когда и корзина s3, и лямбда-функция, и роль находятся в одной учетной записи? Я что-то упустил?
Кроме того, если я создал ведро, используя AWS::S3::Bucket
как часть стека формирования облака, в котором находится Apigateway (мы используем бессерверную версию), мне не нужно добавлять политику ведра, и это все работает нормально.