17

CloudFormation を使用して Tomcat ウェブサーバー スタックを管理していますが、新しいアプリケーション バージョンの未加工の AMI 管理にうんざりしています。シェフの方向に進みたいのですが、今は時間がありません。代わりに、Web サーバーのインスタンス化における単純な問題を克服しようとしています: 新しいマシンがスピンアップしたときに「現在の」WAR をダウンロードするにはどうすればよいですか?

私の考えでは、プライベート S3 バケットと cloudinit を利用することでしたが、IAM クレデンシャルをどうするかについて少し困惑しています。それらをテンプレートのユーザー データに入れることもできますが、特にそのファイルのバージョン管理を行っているため、そうするのは気が進まないのです。私が考えることができる唯一の代替手段は、AMI 自体で環境変数を使用することです。それらは平文である必要がありますが...ええと、私のインスタンスに侵入できれば、私のWebサーバー全体を圧縮してダウンロードできます. IAM ユーザーが他の目的で再利用されず、定期的にローテーションされる限り、問題を解決する合理的な方法のように思えます。何か不足していますか?cloudinit を使用してプライベート S3 アセットを安全にダウンロードするにはどうすればよいですか?

4

4 に答える 4

17

Amazon は最近、EC2 インスタンスに「IAM ロール」を付与できる新機能を発表しました。これにより、特定のインスタンスに特定の S3 リソースを読み取る権限を与えることが非常に簡単になります。

新機能を発表するブログ投稿は次のとおりです。

http://aws.typepad.com/aws/2012/06/iam-roles-for-ec2-instances-simplified-secure-access-to-aws-service-apis-from-ec2.html

EC2 ドキュメントのセクションは次のとおりです。

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances

IAM ドキュメントのセクションは次のとおりです。

http://docs.amazonwebservices.com/IAM/latest/UserGuide/WorkingWithRoles.html

IAM ロールは、HTTP を介してインスタンスで認証情報を使用できるようにするため、インスタンスで実行されているすべてのユーザーまたはプロセスが認証情報を確認できます。

于 2012-07-06T20:46:21.303 に答える
15

この質問への回答を少し更新するには:

IAM ロールに加えて、新しいAWS コマンドライン クライアントにより、これらのアセットのフェッチが簡単になります。IAM を介して付与された AWS 資格情報を環境から自動的にプルし、それらの資格情報の更新を処理します。

ユーザーデータ スクリプトでセキュアな S3 バケットから単一のアセットを取得する例を次に示します。

# Install the AWS command-line tools
pip install awscli

# Fetch the asset
aws s3 cp --region us-east-1 s3://my-private-bucket/a-folder/an-asset.zip /some/destination

そのような単純な。S3 からディレクトリの内容全体をコピーしてアップロードすることもできます。詳細とオプションについては、参考資料を参照してください。

于 2013-10-02T15:33:54.333 に答える
5

IAMロールを持つインスタンスには、自動的にローテーションされる一時的なセキュリティクレデンシャルがあります。これらはhttpから入手できますhttp://169.254.169.254/latest/meta-data/iam/security-credentials/RoleName。ここで、RoleNameはあなたが自分の役割と呼んでいるものです。そのため、インスタンスから簡単に取得できますが、定期的に期限切れになります。

それらを使用するのは少し難しいです。CloudFormationは一時的なクレデンシャルを直接使用することはできません。Amazon LinuxAMIにはPythonbotoがインストールされており、これらのクレデンシャルを自動的に検索して使用できるようになりました。これは、S3バケットb、キーkからローカルファイルfにファイルをフェッチするためのスクリプトに入れることができるワンライナーです:

python -c "import boto;boto.connect_s3().get_bucket('b').get_key('k').get_contents_to_filename('f')"

botoは、ロールの一時的なクレデンシャルを見つけて使用します。これにより、非常に使いやすくなります。

于 2012-12-20T14:45:19.423 に答える
5

プライベート S3 アセットを新しい EC2 インスタンスに安全にダウンロードするには、 EC2 のIAM ロールを使用して EC2 インスタンスに必要な S3 アクセス許可を付与してからaws s3 cp、インスタンスのUserData cloudinit スクリプトを呼び出してアセットをダウンロードする必要があります。

CloudFormation テンプレートから EC2 の IAM ロールをセットアップするには、最小限の権限を付与するように設計されたポリシー(この場合、ダウンロードされる特定の S3 アセットのみを許可する) で、への委任アクセスを持つリソースをAWS::IAM::InstanceProfile参照するAWS::IAM::Roleリソースを使用します。AssumeRolePolicyDocumentec2.amazonaws.com's3:GetObject'

Cloudinit を使用して S3 アセットを新しい EC2 インスタンスにダウンロードし、その内容をStack Outputとして返すテンプレートの完全な例を次に示します。

起動スタック

Description: (securely) download a private S3 asset onto a new EC2 instance with cloudinit
Parameters:
  S3Bucket:
    Description: S3 bucket name
    Type: String
  S3Key:
    Description: S3 object key
    Type: String
Mappings:
  # amzn-ami-hvm-2016.09.1.20161221-x86_64-gp2
  RegionMap:
    us-east-1:
      "64": "ami-9be6f38c"
Resources:
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Principal: {Service: [ ec2.amazonaws.com ]}
          Action: ["sts:AssumeRole"]
      Path: /
      Policies:
      - PolicyName: EC2Policy
        PolicyDocument:
          Version: 2012-10-17
          Statement:
          - Effect: Allow
            Action: ['s3:GetObject']
            Resource: !Sub 'arn:aws:s3:::${S3Bucket}/${S3Key}'
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: [ !Ref EC2Role ]
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", 64 ]
      InstanceType: m3.medium
      IamInstanceProfile: !Ref RootInstanceProfile
      UserData:
        "Fn::Base64":
          !Sub |
            #!/bin/bash
            DATA=$(aws s3 cp s3://${S3Bucket}/${S3Key} -)
            /opt/aws/bin/cfn-signal \
              -e $? \
              -d "$DATA" \
              '${Handle}'
  Handle:
    Type: AWS::CloudFormation::WaitConditionHandle
  Wait:
    Type: AWS::CloudFormation::WaitCondition
    Properties:
      Handle: !Ref Handle
      Timeout: 300
Outputs:
  Result:
    Value: !GetAtt Wait.Data
于 2017-01-05T23:37:05.110 に答える