Почему операторы ролей IAM, такие как для S3 (arn:aws:s3:::), не работают для других ресурсов AWS, таких как SQS?

#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, поскольку они являются глобальными учетными записями, но не глобальными глобальными, поэтому они содержат идентификатор учетной записи, но не регион.