Назад | Перейти на главную страницу

AWS elastic beanstalk: Errno 404 загружает файл с S3 при развертывании

Я слежу за документы при получении сертификатов из s3 при развертывании нового экземпляра в эластичном beanstalk. Инструкции довольно просты: создайте файл конфигурации в app-root/.ebextensions это гласит:

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["elasticbeanstalk-us-west-2-123456789012"]
          roleName: 
            "Fn::GetOptionSetting": 
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
files:
  # Private key
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    authentication: "S3Auth"
    source: https://s3-us-west-2.amazonaws.com/elasticbeanstalk-us-west-2-123456789012/server.key

где ссылки указывают на местоположение вашего сертификата / ключа / чего угодно.

Однако при развертывании пакета приложений (zip) сборка завершается ошибкой. [Errno 404] HTTP Error 404... предполагая, что мои файлы не могут быть найдены в указанном месте, что противоречит факт что файлы являются в точно указанном месте, так как я могу aws s3 cp s3://<pasted-link-to-file> . их из моей командной строки (конечно, в том же регионе).

Кроме того, на первый взгляд, это не похоже на проблему с разрешениями, потому что я бы ожидал чего-то вроде «Доступ запрещен», если бы это было так; политика корзины предоставляет следующие действия для aws-elasticbeanstalk-ec2-role:

"Action": [
    "s3:ListBucket",
    "s3:ListBucketVersions",
    "s3:GetObject",
    "s3:GetObjectVersion"
]

Я также приложил полную политику доступа к s3 к aws-elasticbeanstalk-ec2-role в IAM.

Но тот факт, что я могу получить доступ к файлам из cli и aws-elasticbeanstalk-ec2-role не может их найти, предполагает, что а) что-то может быть не так с моей настройкой: файлы на s3, разрешения s3, конфигурация в .ebextensions или б) документы AWS по этому поводу совершенно не в порядке.

Решил это, явно указав:

roleName: "aws-elasticbeanstalk-ec2-role"

вместо того:

roleName: 
  "Fn::GetOptionSetting": 
    Namespace: "aws:autoscaling:launchconfiguration"
    OptionName: "IamInstanceProfile"
    DefaultValue: "aws-elasticbeanstalk-ec2-role"

в .ebextensions/my_conf.config.

Это может быть связано с тем, что ключ конфигурационного файла и политика S3 относятся к «roleName», а не «IamInstanceProfile».

После устранения неполадок я понял, что проблема:

"Fn::GetOptionSetting": 
  Namespace: "aws:autoscaling:launchconfiguration"
  OptionName: "IamInstanceProfile"
  DefaultValue: "aws-elasticbeanstalk-ec2-role"

Эта опция возвращает профиль экземпляра. Однако для получения учетных данных нам понадобится роль AWS, связанная с профилем экземпляра.

Следующая команда вернет 404:

curl -vvv http://169.254.169.254/latest/meta-data/iam/security-credentials/{Instance-Profile}

Однако следующая команда работает и возвращает временные учетные данные:

curl -vvv http://169.254.169.254/latest/meta-data/iam/security-credentials/{Instance-ROLE}