CloudFormationでEC2用のIAMロールを作成するときはインスタンスプロファイルに注意する
EC2からAWSのリソースにアクセスする必要がある場合は、アクセスキーではなくIAMロールを使ってアクセスしましょう。
以下にコンソールからIAMロールを作成する方法が記載されています。
qiita.com
IAMロール作成の流れ
コンソールから作成すると、以下の流れに見えます。
- IAMロール作成
- IAMポリシーを選択
- EC2作成時にIAMロールを指定
細かいけどこれは間違いで、実際には以下の流れが正しいです。
インスタンスプロファイルはEC2にIAMロールを紐づけるために必要なものになります。
コンソールから作成するとIAMロールと同名のインスタンスプロファイルが作成されるので、EC2作成時にはIAMロールを指定しているように見えるのでしょう。
CloudFormationで作成する場合にはインスタンスプロファイルを作成することに注意しましょう。これを忘れるとIAMロールを作成していたとしても、EC2起動時にIAMロールと紐づけることができません。
CloudFormationサンプル
- IAMロール作成
BastionIAMRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Statement: - Effect: "Allow" Principal: Service: - "ec2.amazonaws.com" Action: - "sts:AssumeRole" Path: "/"
- IAMポリシーを選択
- Actionに必要な権限を記載しましょう。
BastionIAMPolicy: Type: "AWS::IAM::Policy" Properties: PolicyName: BastionIAMPolicy Roles: - Ref: BastionIAMRole PolicyDocument: Statement: - Effect: "Allow" Resource: "" Action: - "ec2:*"
- インスタンスプロファイルを作成してIAMロールと紐づける
- Roleには上で記載したIAMロールを指定します
BastionIAMInstanceProfile: Type: "AWS::IAM::InstanceProfile" Properties: Path: "/" Roles: - Ref: BastionIAMRole
- EC2作成時にインスタンスプロファイルを指定
- IamInstanceProfile以外のプロパティは省略しています
- ここで紐付けているのがIAMロールじゃなくてインスタンスプロファイルだということに注意しましょう。
BastionEC2: Type: "AWS::EC2::Instance" Properties: IamInstanceProfile: Ref: BastionIAMInstanceProfile