it-swarm.com.ru

В доступе отказано, пока эластичный бобовый стебель получает файл S3

У меня есть файлы, хранящиеся на S3, и я написал .ebextensions config, чтобы автоматически копировать их в новые экземпляры. Я получаю эту ошибку в консоли Elastic Beanstalk:

[Экземпляр: INSTANCEID Модуль: AWSEBAutoScalingGroup ConfigSet: null] Ошибка команды на экземпляре. Код возврата: 1 Вывод: команда [CMD-AppDeploy/AppDeployStage0/EbExtensionPreBuild] завершилась ошибкой с кодом ошибки 1. Ошибка во время сборки: не удалось получить https://s3-us-west-1.amazonaws.com/ MyBucket / MyFolder /_ MyFile.txt : ошибка HTTP 403 : AccessDenied

Мой конфигурационный файл .ebextension имеет этот раздел:

files:
    "/target/file/path" :
        mode: "000777"
        owner: ec2-user
        group: ec2-user
        source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt

Пытаясь заставить это копирование файлов работать, я также ослабил разрешения, предоставив роли IAM с эластичными beanstalk стандартной политикой доступа только для чтения для всего S3. Это политика такова:

{
  "Effect": "Allow",
  "Action": [
    "s3:Get*",
    "s3:List*"
  ],
  "Resource": "*"
}

Тем не менее, этап предварительной сборки все еще не выполняется. Я дал исходный URL в правильном формате? Есть ли еще один объект/политика безопасности? Помогите, пожалуйста :)

13
lastoneisbearfood

Я нашел решение, чтобы преодолеть эту ошибку. Оказывается, добавление раздела Resources в файл конфигурации .ebextensions заставляет его работать. Весь файл становится:

files:
  "/target/file/path" :
    mode: "000777"
    owner: ec2-user
    group: ec2-user
    source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Access:
          type: S3
          roleName: aws-elasticbeanstalk-ec2-role
          buckets: _MyBucket

На данный момент, я не знаю достаточно, чтобы понять, почему так должно быть. Надеемся, что это может помочь кому-то, кто потерял, двигаться вперед и в конечном итоге получить лучшее понимание. Я основал свой ответ на этой ссылке https://forums.aws.Amazon.com/message.jspa?messageID=541634

7
lastoneisbearfood

Документация очень отрывочна по этому вопросу (вероятно, идеальный кандидат на StackExchange Docs!).

Чтобы сделать это правильно с .ebextensions, вам нужно разрешить пользователю IAMs экземпляра Beanstalk в политике bucket, настроить конфигурацию аутентификации AWS::CloudFormation::Authentication: и присоединить конфигурацию к удаленным источникам. Это своего рода гибрид всех других ответов, но все они так или иначе потерпели неудачу для меня.

Предполагая, что ваша роль экземпляра IAM aws-elasticbeanstalk-ec2-role:

  1. Установите ведро AWS, чтобы разрешить пользователю Beanstalk IAM. Отредактируйте "политику ведра":

    {
        "Version": "2012-10-17",
        "Id": "BeanstalkS3Copy",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "<beanstalk_iam_role_arn>"
                },
                "Action": [
                    "s3:ListBucketVersions",
                    "s3:ListBucket",
                    "s3:GetObjectVersion",
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::<bucket_name>",
                    "arn:aws:s3:::<bucket_name>/*"
                ]
            }
        ]
    }
    

    где:

    beanstalk_iam_role_arn = полностью определенная роль IAMs экземпляра. См. "Роль IAM", связанную с работающим экземпляром, если он доступен, или посмотрите конфигурацию среды. Пример: arn:aws:iam::12345689:role/aws-elasticbeanstalk-ec2-role

    bucket_name = ваше имя корзины

  2. В вашем .ebextension/myconfig.config добавьте блок аутентификации S3, который использует вашего пользователя экземпляра IAMs:

    Resources:
    AWSEBAutoScalingGroup:
      Metadata:
        AWS::CloudFormation::Authentication:
          S3Auth:
            type: "s3"
            buckets: ["bucket_name"]
            roleName:
              "Fn::GetOptionSetting":
                Namespace: "aws:asg:launchconfiguration"
                OptionName: "IamInstanceProfile" 
                DefaultValue: "aws-elasticbeanstalk-ec2-role"
    

    Установите bucket_name соответственно

  3. Определите удаленный файл и прикрепите блок аутентификации S3:

    "/etc/myfile.txt" :
       mode: "000400"
       owner: root
       group: root
       authentication: "S3Auth" # Matches to auth block above.
       source: https://s3-eu-west-1.amazonaws.com/mybucket/myfile.txt
    

    Установите ваш источник URL соответствующим образом

16
Alastair McCormack

Подобно ответу chaseadamsio, вы можете настроить роль, назначенную экземпляру EC2, с помощью политики доступа к ресурсам S3, а затем использовать предустановленные утилиты AWS CLI для перемещения файлов.

Я подошел к этому так, чтобы создать роль, предназначенную для данного приложения EB, а затем применить политику, аналогичную следующей:

"Statement": [
    {
        "Sid": "<sid>",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::<your_bucket_path>/*"
        ]
    }
]

Это дает вашему экземпляру доступ, а затем, чтобы получить файлы, добавьте блок "команд" в вашу конфигурацию, например:

commands: 
  01-get-file:
    command: aws s3 cp s3://<your_bucket_path>/your-file.txt /home/ec2-user
  02-execute-actions: 
    [unpack, run scripts, etc..]

Очевидно, что при необходимости вы можете использовать другие возможности AWS CLI. Я обнаружил, что это решило множество проблем, с которыми я столкнулся при доступе к S3, и значительно упростило развертывание.

11
Matt Holtzman

Альтернативой настройке конфигурации .ebextensions может быть установка политики для aws-elasticbeanstalk-ec2-role в диспетчере IAM (или создание новой роли специально для сред гибкой среды beanstalk для песочницы ваших автоматически масштабируемых экземпляров ec2.

Для этого перейдите к диспетчеру IAM в веб-консоли и нажмите "Роли" с левой стороны. Вы должны увидеть имя своего экземпляра в списке ролей, нажав на него, вы попадете на страницу администрирования для этой конкретной роли. Присоедините новую политику роли к роли в разделе "Разрешения" с документом политики, соответствующим тому, что вы хотите, чтобы у вашего ec2 были разрешения (в этом случае вы бы дали ему политику доступа к корзине s3 с именем _MyBucket, и вам не следует больше не требуется раздел Resources в вашей конфигурации .ebextensions.

3
chaseadamsio

Если у вас есть роль IAM для компьютера, настроенного на получение доступа к файлу, вы можете сделать следующее в .ebextensions

commands:
  01a_copy_file:
    command: aws s3 cp s3://bucket/path/file /destination/
0
mjallday