Для контекста я использую безсерверный фреймворк, поэтому происходит несколько вещей:
- Роль создается с некоторыми прикрепленными политиками, и лямбда-функция получает ее как роль выполнения. Политики S3 (список более важных):
ListBucket
в корзину ARN в качестве ресурса
GetObject
, PutObject
DeleteObjet
в ARN корзины как ресурс с префиксом /*
- Я создаю корзину, используя синтаксис ресурсов Cloudformation, и устанавливаю общедоступную политику чтения, чтобы использовать ее в качестве статического хоста веб-сайта.
- Я также включаю другой оператор политики в политику сегмента S3, где я назначаю операции записи и устанавливаю роль выполнения ARN в качестве принципала.
Я получил следующий iamRoleStatements
раздел:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource:
- Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:DeleteObject"
- "s3:GetObjectVersionTagging"
- "s3:PutObjectVersionTagging"
Resource:
- Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- "/*"
Я действительно могу подтвердить, что он создает следующую политику для сгенерированной роли:
{
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name-here"
],
"Effect": "Allow"
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectVersionTagging",
"s3:PutObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::bucket-name-here/*"
],
"Effect": "Allow"
}
Имея это, я запустил лямбда-функцию для выполнения putObject
над этим бакетом. Получив 'Access denied error'
, я подумал , что если самому ведру нужно разрешить запись , поэтому я включил оператор write в политику ведра:
StaticSiteBucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
BucketName: ${self:service}-static-site-${self:provider.stage}
WebsiteConfiguration:
IndexDocument: index.html
StaticSiteBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket:
Ref: StaticSiteBucket
PolicyDocument:
Statement:
- Sid: PublicReadGetObject
Effect: Allow
Principal: "*"
Action:
- s3:GetObject
Resource:
Fn::Join: [
"", [
"arn:aws:s3:::",
{
"Ref": "StaticSiteBucket"
},
"/*"
]
]
- Sid: AllowLambdaRoleWrite
Effect: Allow
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:DeleteObject"
- "s3:GetObjectVersionTagging"
- "s3:PutObjectVersionTagging"
Principal:
AWS:
- Fn::GetAtt: [ IamRoleLambdaExecution, Arn ]
Resource:
Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- "/*"
, которая генерирует следующую политику в сегменте S3:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name-here/*"
},
{
"Sid": "AllowLambdaRoleWrite",
"Effect": "Allow",
"Principal": {
"AWS": "<role-arn>"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectVersionTagging",
"s3:PutObjectVersionTagging"
],
"Resource": "arn:aws:s3:::bucket-name-here/*"
}
]
}
Итак, в нескольких словах я попытался:
- Разрешение роли иметь права на запись, не повезло
- Прикрепление разрешений на запись к этой роли из политики корзины, не повезло
Чего мне не хватает?