プライベート S3 アセットを新しい EC2 インスタンスに安全にダウンロードするには、 EC2 のIAM ロールを使用して EC2 インスタンスに必要な S3 アクセス許可を付与してからaws s3 cp
、インスタンスのUserData cloudinit スクリプトを呼び出してアセットをダウンロードする必要があります。
CloudFormation テンプレートから EC2 の IAM ロールをセットアップするには、最小限の権限を付与するように設計されたポリシー(この場合、ダウンロードされる特定の S3 アセットのみを許可する) で、への委任アクセスを持つリソースをAWS::IAM::InstanceProfile
参照するAWS::IAM::Role
リソースを使用します。AssumeRolePolicyDocument
ec2.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