Роль create_dataset_import_job Amazon Forecast S3 требует наличия звездного доступа к ресурсам S3 - PullRequest
0 голосов
/ 09 марта 2020

Я написал лямбда-функцию, которая создает задание импорта набора данных ( ссылка на API ). Для свойства Datasource этого запроса требуется элемент конфигурации S3 *, который, в свою очередь, содержит роль IAM", которую Amazon Forecast может предположить для доступа к Amazon S3 bucket или files ".

Пытаясь следовать принципу наименьшего доступа, я хотел бы дать этой роли (определение облачного формирования ниже) как можно меньше привилегий. Я могу ограничить его действия только List и Get; однако, это не будет работать, если я не дам ему доступ к Resource: *. Я бы предпочел предоставить ему доступ к Resource: arn:aws:s3:::my-bucket/* (или еще лучше Resource: arn:aws:s3:::my-bucket/path/to/my_file.csv. Я получаю сообщение об ошибке (когда не с использованием Resource: *):

An произошла ошибка (404) при вызове операции HeadObject: не найдено

или

Произошла ошибка (403) при вызове операции HeadObject: Forbidden

, в зависимости от того, запущен ли я локально (через SAM CLI) или в консоли LAMBDA.

¿Кто-нибудь сталкивался с причиной, по которой Forecast мог выдать ошибку при создании задания импорта набора данных без только для записи доступ к ALL s3, в отличие от одного сегмента или лучше одного файла?

  CreateDatasetImportJobS3Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - forecast.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        -
          PolicyName: ReadFromBucketPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              -
                Effect: Allow
                Action:
                  - s3:ListBucket
                  - s3:GetObject
                # I'd like to be able to do this without a STAR resource;
                # however, it doesn't seem to work without
                Resource: "*"

1 Ответ

1 голос
/ 09 марта 2020

s3://my-bucket/* не правильный формат. Правильный формат должен быть действительным ARN, например arn:aws:s3:::my-bucket/*. Кроме того, когда у вас есть действия API, такие как ListBucket, вам нужно перечислить сегмент ARN , а не метку внутри этого сегмента. Таким образом, вы действительно должны иметь Ресурс, указанный как arn:aws:s3:::my-bucket.

Чтобы быть в безопасности, я обычно ставлю оба, делая вашу окончательную политику:

Resource: 
   - "arn:aws:s3:::my-bucket"
   - "arn:aws:s3:::my-bucket/*"

Первый ресурс, arn:aws:s3:::my-bucket , охватывает такие операции, как ListBucket. Второй ресурс, arn:aws:s3:::my-bucket/*, охватывает такие операции, как GetObject (так как сам объект будет находиться под путем, который указан подстановочным знаком).

...