EC2 IAMロールの作成と適用をCLIから行う

AWSコンソールからであれば簡単なんですが、CLIからだとインスタンスプロファイル(EC2 IAMロール)を作るのにロールの作成から必要なので若干面倒です。

ここでは前提として、複数のインスタンスに対してそれぞれ違うロール(ポリシーは同一)を適用します。

表にすると次のような感じです。

インスタンスID ロール名 / インスタンスプロファイル名 ポリシーARN
instanceid1 rolename1 arn:aws:iam::aws:policy/service-role/servicerole
instanceid2 rolename2 arn:aws:iam::aws:policy/service-role/servicerole

手順

Assume-roleを準備

cat << _EOF > Trust-Policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
_EOF

インスタンスロール作成とロールのアタッチ

INSTANCE_ROLE_NAMES=(
  rolename1
  rolename2
)
for INSTANCE_ROLE_NAME in ${INSTANCE_ROLE_NAMES[@]};
do
  # ロール作成
  aws iam create-role --role-name $INSTANCE_ROLE_NAME --assume-role-policy-document file://Trust-Policy.json
  # ロールにポリシーをアタッチ
  aws iam attach-role-policy --role-name $INSTANCE_ROLE_NAME --policy-arn arn:aws:iam::aws:policy/service-role/servicerole
  # インスタンスプロファイル作成
  aws iam create-instance-profile --instance-profile-name $INSTANCE_ROLE_NAME
  # インスタンスプロファイルにロールをアタッチ
  aws iam add-role-to-instance-profile --role-name $INSTANCE_ROLE_NAME --instance-profile-name $INSTANCE_ROLE_NAME
done

インスタンスにインスタンスロールのアタッチ

※停止中インスタンスの場合、起動しないと表示上反映されない

aws ec2 associate-iam-instance-profile --instance-id instanceid1 --iam-instance-profile Name=rolename1
aws ec2 associate-iam-instance-profile --instance-id instanceid2 --iam-instance-profile Name=rolename2

参考: https://aws.amazon.com/jp/blogs/news/new-attach-an-aws-iam-role-to-an-existing-amazon-ec2-instance-by-using-the-aws-cli/