web-dev-qa-db-ja.com

ElasticBeanstalkがS3ファイルを取得しているときにアクセスが拒否されました

S3にファイルを保存していて、.ebextensions configを使用して、それらを新しいインスタンスに自動的にコピーします。 ElasticBeanstalkコンソールで次のエラーが発生します。

[インスタンス:[〜#〜] 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

このファイルコピーを機能させるために、Elastic Beanstalk IAMロールにすべてのS3への標準の読み取り専用アクセスポリシーを与えることで、アクセス許可を緩和しました。ポリシーは次のとおりです。

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

それでも、ビルド前のコピー手順は失敗します。ソースURLを正しい形式で指定しましたか?別のセキュリティエンティティ/ポリシーが関係していますか?助けてください :)

14

このエラーを克服するための解決策を見つけました。 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

ドキュメントはこのテーマについて非常に大雑把です(おそらくStackExchangeドキュメントの理想的な候補です!)。

.ebextensionsでこれを正しく行うには、バケットポリシーでBeanstalkインスタンスIAMユーザーを許可し、AWS::CloudFormation::Authentication: auth configをセットアップし、configをリモートソースにアタッチする必要があります。これは他のすべての答えのハイブリッドのようなものですが、私にとってはすべてが何らかの形で失敗しました。

IAMインスタンスの役割がaws-elasticbeanstalk-ec2-roleであると仮定します:

  1. BeanstalkIAMユーザーを許可するようにAWSバケットを設定します。 「バケットポリシー」を編集します。

    {
        "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=完全修飾インスタンスIAMロール。可能な場合は、実行中のインスタンスに関連付けられている「IAMロール」を参照するか、環境構成を参照してください。例:arn:aws:iam::12345689:role/aws-elasticbeanstalk-ec2-role

    bucket_name=バケット名

  2. .ebextension/myconfig.configに、IAMインスタンスユーザーを使用するS3認証ブロックを追加します。

    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
    

    source URLを適切に設定します

19

Chaseadamsioの回答と同様に、S3リソースにアクセスするポリシーを使用してEC2インスタンスに与えられたロールを設定し、プリインストールされたAWSCLIユーティリティを使用してファイルを移動できます。

私がこれにアプローチした方法は、特定の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..]

もちろん、必要に応じて他のAWSCLIユーティリティを使用できます。これにより、S3アクセスで発生していた多くの問題が解決され、展開がはるかに簡単になることがわかりました。

11
Matt Holtzman

.ebextensions構成を設定する代わりに、IAMマネージャー内のaws-elasticbeanstalk-ec2-roleにポリシーを設定する(または、自動スケーリングされたec2インスタンスをサンドボックス化するためにElasticBeanstalk環境専用の新しいロールを作成する)。

これを行うには、Webコンソール内のIAMマネージャーに移動し、左側の[ロール]をクリックします。ロールのリストにインスタンス名が表示されているはずです。それをクリックすると、その特定のロールの管理ページに移動します。 「Permissions」の下のロールに新しいロールポリシーを添付し、ec2にアクセス許可を与えるものと一致するポリシードキュメントを作成します(この場合、_MyBucketというs3バケットにアクセスするためのポリシーを指定します。 .ebextensions設定のResourcesセクションは不要になります。

3
chaseadamsio

ファイルにアクセスするように構成されたマシンのIAMロールがある場合は、.ebextensionsで次の操作を実行できます。

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