#amazon-web-services #aws-lambda #amazon-iam #serverless-framework
Вопрос:
Я успешно помещал операторы ролей IAM в свой бессерверный.yml для доступа к S3 в течение некоторого времени и предполагал, что все будет работать аналогично, когда я добавил SQS. Я взял очень простой arn:aws:s3::: и заменил s3 на SQS, как вы можете видеть ниже:
iam:
role:
statements:
- Effect: 'Allow'
Action:
- 's3:ListBucket'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- mahtestbucket
- Effect: 'Allow'
Action:
- 's3:GetObject'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- mahtestbucket
- '/*'
- Effect: 'Allow'
Action:
- 's3:ListBucket'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- mahfailbucket
- Effect: 'Allow'
Action:
- 's3:PutObject'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- mahfailbucket
- '/*'
- Effect: 'Allow'
Action:
- 'sqs:SendMessage'
- 'sqs:GetQueueUrl'
- 'sqs:GetQueueAttributes'
Resource:
Fn::Join:
- ''
- - 'arn:aws:sqs:::'
- mahqueue
Это развертывается без ошибок. Я вижу политическое заявление, но оно просто не работает. Функция lambda завершается ошибкой при попытке доступа к ресурсу SQS.
Ответ №1:
Я решил опубликовать это со своим собственным ответом, так как мне потребовалось несколько часов потраченного впустую времени, чтобы проверить, что политика создается, и определить, что происходит. Я считаю, что, поскольку S3 обычно не включает определение региона, а сегменты являются глобальными, работает более простая спецификация. Однако SQS и, вероятно, большинство других ресурсов нуждаются в этих вещах. Как только я определил, что это может быть проблемой, потребовалось небольшое исследование, чтобы заставить работать правильный синтаксис:
- Effect: 'Allow'
Action:
- 'sqs:SendMessage'
- 'sqs:GetQueueUrl'
- 'sqs:GetQueueAttributes'
- 'sqs:ListQueues'
Resource:
Fn::Join:
- ''
- - !Sub 'arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:'
- mahqueue
Комментарии:
1. Это правильно. Имя корзины-это уникальный идентификатор корзины, поэтому нет необходимости указывать регион или учетную запись. ARN для других служб включают ARN и учетную запись, поскольку ресурсы с тем же именем могут быть созданы в других регионах или учетных записях. Например, я мог бы создать очередь Amazon SQS в своей учетной записи с указанным именем
mahqueue
, поэтому требуется более конкретная ссылка.2. И есть промежуточное положение, например, для ресурсов IAM, поскольку они являются глобальными учетными записями, но не глобальными глобальными, поэтому они содержат идентификатор учетной записи, но не регион.