У меня были лямбды из одного региона (us-west-2), получающие 403 за операции S3 (HeadObject, PutObject, CopyObject) против объектов в корзине из другого региона (ca-central-1).Симулятор политики заверил меня, что операции должны работать в соответствии с моей политикой, но явно было что-то еще.Эта политика привязана к роли, и у меня есть доверительные отношения между лямбдой и этой ролью.
Одна из попыток, которые я предпринял для решения этой проблемы, состояла в том, чтобы указать имя региона, добавив его к имени сегмента.
, т. Е. Изменив:
head_object(Bucket="foo", ...)
на (немного) более квалифицированное наименование:
head_object(Bucket="foo.us-west-2", Key="bar")
Интересно, что это изменило бы 403 на 404.
Я наткнулся на этот обходной путь (?) через догадки, основываясь на требуемой структуре заголовка хоста и intro: работа с сегментами .Но это натянуто.
Я не могу найти ссылку в документах, где перечислены различные принятые формы имен сегментов (например, от простого имени до полностью определенного ARN).Доступен ли список поддерживаемых форматов для указания имен сегментов и ключей?
Добавление .<region>
к имени сегмента позволит HeadObject
работать по-разному, но PutObject
и CopyObject
завершатся неудачно с NoSuchBucket
если я попробую тот же трюк.Возможно, каждый вызов API S3 имеет разный синтаксис для указания регионов источника и назначения?
Я включил политику, привязанную к роли моей лямбды.Может быть, есть что-то конкретное, что мешает межрегиональным операциям, как это было предложено в комментариях?Мои исходные и конечные сегменты не имеют прикрепленной политики сегментов.Лямбда и два сегмента принадлежат одной и той же учетной записи.
У лямбды есть роль со следующей политикой:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3Ops",
"Effect": "Allow",
"Action": [
"s3:DeleteObjectTagging",
"s3:DeleteObjectVersion",
"s3:GetObjectVersionTagging",
"s3:DeleteObjectVersionTagging",
"s3:GetObjectVersionTorrent",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:GetObjectTorrent",
"s3:AbortMultipartUpload",
"s3:GetObjectVersionAcl",
"s3:GetObjectTagging",
"s3:GetObjectVersionForReplication",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::a-specific-bucket-1/*",
"arn:aws:s3:::a-specific-bucket-2/*",
"arn:aws:s3:::*/*",
"arn:aws:logs:*:*:*"
]
},
{
"Sid": "AllowLogging",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "AllowPassingRoleToECSTaskRoles",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "*"
},
{
"Sid": "AllowStartingECSTasks",
"Effect": "Allow",
"Action": "ecs:RunTask",
"Resource": "*"
},
{
"Sid": "AllowCreatingLogGroups",
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Примечание. Я использовал оба символа подстановкии конкретные имена сегментов в списке ресурсов.Раньше у меня были только конкретные имена, а затем я добавлял шаблоны для проверки.
Примечание: Это очень связано с этим вопросом на S3 403s .Хотя принятый ответ, кажется, утверждает, что он связан с корректировкой политики, я думаю, что это просто вопрос квалификации именования ресурсов.