やーまんぶろぐ

気が向いた時にだけ書くブログ

CloudFormationでEC2用のIAMロールを作成するときはインスタンスプロファイルに注意する

EC2からAWSのリソースにアクセスする必要がある場合は、アクセスキーではなくIAMロールを使ってアクセスしましょう。

以下にコンソールからIAMロールを作成する方法が記載されています。
qiita.com

IAMロール作成の流れ

コンソールから作成すると、以下の流れに見えます。

  • IAMロール作成
  • IAMポリシーを選択
  • EC2作成時にIAMロールを指定

細かいけどこれは間違いで、実際には以下の流れが正しいです。

  • IAMロール作成
  • IAMポリシーを選択
  • インスタンスプロファイルを作成してIAMロールと紐づける
  • EC2作成時にインスタンスプロファイルを指定

インスタンスプロファイルは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