皆様こんにちは。
今回はCLIを利用して高可用性アーキテクトの構築をしていきます。
この記事ではIAMロール、IAMポリシー、インスタンスプロファイルの作成を行います。
このブログはCLIによるIAMロール、IAMポリシー、インスタンスプロファイルの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。

1.高可用性アーキテクト構築目次

目次はこちら

2.IAMとは

AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証 (サインイン) し、誰にリソースの使用を承認する (アクセス権限を持たせる) かを制御します。
引用:IAM とは

IAMユーザ

IAMユーザは個人に紐づくアカウントであり、その個人に必要な権限を設定したIAMポリシーをアタッチします。

IAMロール

IAMロールは複数のIAMポリシーを一つにまとめたものであり、EC2やLambda等といったAWSのリソースに対してIAMロールをアタッチします。

IAMポリシー

IAMポリシーは設定するAWSリソースに対する許可を定義します。
IAMポリシーで定義された許可は、アクションを許可または拒否するかを決定します。

類似の認証サービスとしては「AWS Single Sign-On 」、「Amazon Cognito」等があげられます。

今回はCloudWatch,S3の権限を設定したポリシーを作成して、それをアタッチしたIAMロールを作成します。
IAMロールを作成し、EC2にアタッチしないと、カスタムメトリクスの発行とS3に対しての操作ができないためです。

3.フロー図

file

  1. 下記で作成したポリシーをアタッチしたEC2用のIAMロールを作成します。

  2. CloudWatchの権限を設定したポリシーを作成して、インスタンスのカスタムメトリクスを登録できるようにします。

  3. S3の権限を設定したポリシーを作成して、インスタンスがS3内の読み書きをできるように設定します。

4.IAM構築

4-1.IAMポリシー作成

必要なIAMポリシーの作成を行います。

まずCloudwatchAlarmにカスタムメトリクスをプッシュする権限を持ったポリシー設定のJSONファイルを作成します。

ファイル名:cloudwatchpolicy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
         "ec2:DescribeTags"
            ],
            "Resource": "*"
        }
    ]
}

Version : ポリシー言語のバージョンで、現時点では2012-10-17と2008-10-17の2つがあり、最新版のものを指定しています。
Statement :ポリシーの主要要素で、一つのステートメントまたは複数のステートメントを作成することができます。
Effect : Statement内のActionを許可するか拒否するか指定する。
Action : Effectによって許可またはDeny拒否される操作を定義する。この場合、

  • "cloudwatch:PutMetricData" でインスタンスがカスタムメトリクスを発行できる権限を与えています。
  • "ec2:DescribeTags"でカスタムメトリクス発行時に必要なインスタンスの情報をインスタンス自身が取得できる権限を与えています。

Resource : EffectとActionの対象となるリソース。

CloudWatch には、ポリシーのリソースを使用して制御するためのリソースがないため、IAM ポリシーではワイルドカード文字 (*) を使用します。
引用:ポリシー要素 (アクション、効果、プリンシパル) の指定

とのことですので"*"(全て)を設定しています。

次にポリシーを作成するため、[aws iam create-policy]コマンドを使用します。

使用するオプション 設定値 説明
--policy-name CloudWatch-Wordpress-ut 設定したいポリシーネームを入力
--policy-document file://C:\policies\cloudwatchpolicy.json ポリシー設定のパスを指定します
--tags Key=Name,Value=CloudWatch-Wordpress-ut IAMポリシーにネームタグを付けます

入力

aws iam create-policy `
    --policy-name CloudWatch-Wordpress-ut `
    --policy-document file://C:\policies\cloudwatchpolicy.json `
    --tags Key=Name,Value=CloudWatch-Wordpress-ut

出力

{
    "Policy": {
        "PolicyName": "CloudWatch-Wordpress-ut",
        "PolicyId": "xxxxx",
        "Arn": "arn:aws:iam::xxxxx:policy/CloudWatch-Wordpress-ut",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2022-05-20T06:44:56+00:00",
        "UpdateDate": "2022-05-20T06:44:56+00:00",
        "Tags": [
            {
                "Key": "Name",
                "Value": "CloudWatch-Wordpress-ut"
            }
        ]
    }
}

CloudWatchの権限を設定したポリシーを作成できました。

次にS3の権限を設定したIAMポリシーを作成します。
まずインスタンスがS3内の読み書きをできるような権限を持ったポリシー設定のJSONファイルを作成します。

ファイル名:s3policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketPublicAccessBlock",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::ut-wordpress-s3"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::ut-wordpress-s3/*"
        }
    ]
}

Version : ポリシー言語のバージョンで、現時点では2012-10-17と2008-10-17の2つがあり、最新版のものを指定しています。
Statement :ポリシーの主要要素で、一つのステートメントまたは複数のステートメントを作成することができます。
Effect : Statement内のActionを許可するか拒否するか指定する。
Action : Effectによって許可またはDeny拒否される操作を定義する。この場合、

  • "s3:ListBucket","s3:GetBucketLocation","s3:GetBucketPublicAccessBlock"でリソースで指定したS3の情報を取得できる権限を与えています。
  • "s3:PutObject","s3:PutObjectAcl"でインスタンスがS3に対し画像をアップロードできる権限を与えています。
  • "s3:GetObject"でインスタンスがS3に対し画像を取得できる権限を与えています。
  • "s3:DeleteObject"でインスタンスがS3の画像を削除できる権限を与えています。

Resource : 今回作成する特定のS3を指定しています。

次にポリシーを作成するため、[aws iam create-policy]コマンドを使用します。

使用するオプション 設定値 説明
--policy-name S3-Wordpress-ut 設定したいポリシーネームを入力
--policy-document file://C:\policies\s3policy.json ポリシー設定のパスを指定します
--tags Key=Name,Value=S3-Wordpress-ut IAMポリシーにネームタグを付けます

入力

aws iam create-policy `
    --policy-name S3-Wordpress-ut `
    --policy-document file://C:\policies\s3policy.json `
    --tags Key=Name,Value=S3-Wordpress-ut

出力

{
    "Policy": {
        "PolicyName": "S3-Wordpress-ut",
        "PolicyId": "xxxxx",
        "Arn": "arn:aws:iam::xxxxx:policy/S3-Wordpress-ut",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2022-05-20T04:23:15+00:00",
        "UpdateDate": "2022-05-20T04:23:15+00:00",
        "Tags": [
            {
                "Key": "Name",
                "Value": "S3-Wordpress-ut"
            }
        ]
    }
}

S3の権限を設定したポリシーを作成できました。

4-2.IAMロール作成

次はIAMロールの作成をしていきます。
今回利用するIAMロールは以下になります。

IAMロール名 付与先サービス 説明
umemoto-wordpress-role EC2 カスタムメトリクス発行ため
S3への画像アップロードのため

IAMロール作成の前に、ロール作成時に使用する信頼ポリシーをjson形式で自前に作成します。

信頼ポリシーとアイデンティティベースのポリシーのいずれも IAM ロールにアタッチする必要があります。信頼ポリシーでは、ロールを引き受けることができるプリンシパルエンティティ (アカウント、ユーザー、ロール、フェデレーティッドユーザー) を定義します。
引用:IAM でのポリシーとアクセス許可

とのことですので信頼ポリシーで今回作成するIAMロールを利用するAWSサービスを指定します。

ファイル名:trustpolicy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Version : ポリシー言語のバージョンで、現時点では2012-10-17と2008-10-17の2つがあり、最新版のものを指定しています。
Statement :ポリシーの主要要素で、一つのステートメントまたは複数のステートメントを作成することができます。
Effect : Statement内のPrincipalを許可するか拒否するか指定する。
Principal :リソースへのアクセスを許可または拒否するPrincipalを指定します。この場合、
Service: "ec2.amazonaws.com"でEC2を指定しています。
Action : "sts:AssumeRole" でEC2に対しロールをアタッチできるように設定しています。

次にIAMロールの作成には、[aws iam create-role]コマンドを使用します。

使用するオプション 設定値 説明
--role-name umemoto-wordpress-role 設定したいロールネームを入力
--assume-role-policy-document file://C:\policies\trustpolicy.json 信頼ポリシーのパスを指定します
--tags Key=Name,Value=umemoto-wordpress-role IAMにネームタグを付けます

入力

aws iam create-role `
    --role-name umemoto-wordpress-role `
    --assume-role-policy-document file://C:\policies\trustpolicy.json `
    --tags Key=Name,Value=umemoto-wordpress-role

出力

{
    "Role": {
        "Path": "/",
        "RoleName": "umemoto-wordpress-role",
        "RoleId": "xxxxx",
        "Arn": "arn:aws:iam::xxxxx:role/umemoto-wordpress-role",
        "CreateDate": "2022-0x-0xT09:06:40+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto-wordpress-role"
            }
        ]
    }
}

4-3.IAMポリシーをIAMロールにアタッチ

次にIAMロールに今回必要なIAMポリシーをアタッチします。
アタッチするために、[aws iam attach-role-policy]コマンドを使用します。

使用するオプション 設定値 説明
--role-name umemoto-wordpress-role ロールネームを入力
--policy-arn arn:aws:iam::xxxxx:policy/CloudWatch-Wordpress-ut,
arn:aws:iam::xxxxx:policy/S3-Wordpress-ut
アタッチしたいポリシーのARNを入力

入力

aws iam attach-role-policy `
    --role-name umemoto-wordpress-role `
    --policy-arn arn:aws:iam::xxxxx:policy/CloudWatch-Wordpress-ut
aws iam attach-role-policy `
    --role-name umemoto-wordpress-role `
    --policy-arn arn:aws:iam::xxxxx:policy/S3-Wordpress-ut

出力なし

最後に作成したロールにポリシーがアタッチされているかの確認のため、[aws iam list-attached-role-policies]コマンドを使用します。

使用するオプション 設定値 説明
--role-name umemoto-wordpress-role ロールネームを入力

入力

aws iam list-attached-role-policies --role-name umemoto-wordpress-role

出力

{
    "AttachedPolicies": [
        {
            "PolicyName": "CloudWatch-Wordpress-ut",
            "PolicyArn": "arn:aws:iam::xxxxx:policy/CloudWatch-Wordpress-ut"
        },
        {
            "PolicyName": "S3-Wordpress-ut",
            "PolicyArn": "arn:aws:iam::xxxxx:policy/S3-Wordpress-ut"
        }
    ]
}

これでポリシーがアタッチされていることを確認できました。

4-4.インスタンスプロファイル作成

CLIを利用してEC2にIAMをアタッチする場合、インスタンスプロファイルの作成が必要なので、[aws iam create-instance-profile]コマンドを利用します。

使用するオプション 設定値 説明
--instance-profile-name umemoto-wordpress-profile プロファイルネームを入力

入力

aws iam create-instance-profile --instance-profile-name umemoto-wordpress-profile

出力

{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "umemoto-wordpress-profile",
        "InstanceProfileId": "xxxxx",
        "Arn": "arn:aws:iam::xxxxx:instance-profile/umemoto-wordpress-profile",
        "CreateDate": "2022-05-10T04:20:33+00:00",
        "Roles": []
    }
}

次に作成したインスタンスプロファイルにロールをアタッチします。
アタッチのために、[aws iam add-role-to-instance-profile]コマンドを使用します。

使用するオプション 設定値 説明
--instance-profile-name umemoto-wordpress-profile プロファイルネームを入力
--role-name umemoto-wordpress-role ロールネームを入力

入力

aws iam add-role-to-instance-profile `
    --instance-profile-name umemoto-wordpress-profile `
    --role-name umemoto-wordpress-role

出力なし

最後に作成したインスタンスプロファイルにロールがアタッチできているかの確認のために、[aws iam get-instance-profile]コマンドを使用します。

使用するオプション 設定値 説明
--instance-profile-name umemoto-wordpress-profile プロファイルネームを入力

入力

aws iam get-instance-profile --instance-profile-name umemoto-wordpress-profile

出力

{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "umemoto-wordpress-profile",
        "InstanceProfileId": "xxxx",
        "Arn": "arn:aws:iam::xxxxx:instance-profile/umemoto-wordpress-profile",
        "CreateDate": "2022-05-10T04:20:33+00:00",
        "Roles": [
            {
                "Path": "/",
                "RoleName": "umemoto-wordpress-role",
                "RoleId": "xxxxx",
                "Arn": "arn:aws:iam::xxxxx:role/umemoto-wordpress-role",
                "CreateDate": "2022-05-02T09:06:40+00:00",
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": "ec2.amazonaws.com"
                            },
                            "Action": "sts:AssumeRole"
                        }
                    ]
                }
            }
        ],
        "Tags": []
    }
}

確認できました。
これでインスタンスプロファイルの作成は完了です。

5.検証

作成したIAMロールが実際に動作するかのテスト行っていきます。

今回はインスタンスがS3に対しテストファイルをアップロード、コピー、削除できるかどうかを検証します。

①まず自分のPCのPowerShell環境から検証用のS3を以下のコマンドを利用して作成します。

aws s3 mb s3://ut-wordpress-s3

②次にロールをアタッチした検証用のEC2を作成します。

EC2作成には、[aws ec2 run-instances]コマンドを使用します。

使用するオプション 設定値 説明
--image-id ami-0cbec04a61be382d9 使用するAMIのIDを入力
--count 1 使用するEI アクセラレータ数を指定
--instance-type t2.micro 使用するインスタンスタイプを指定
--key-name umemoto_kadai_1 先ほど作成したキーネームを入力
--iam-instance-profile Name=umemoto-wordpress-profile 作成したインスタンスプロファイルの名前を入力
--security-group-ids sg-xxxxx 作成したEC2用のSGのIDを入力
--subnet-id subnet-xxxxx 使用するパブリックサブネットを入力
--private-ip-address 10.0.1.50 テストなので構成図に設定したIP以外を入力
--capacity-reservation-specification CapacityReservationPreference=none キャパシティの予約をオフに
--tag-specifications "ResourceType=instance, Tags=
[{Key=Name,Value=iamrole-test}]"
タグを設定

入力

aws ec2 run-instances ^
    --image-id ami-0cbec04a61be382d9 ^
    --count 1 --instance-type t2.micro ^
    --key-name umemoto_kadai_1 ^
    --iam-instance-profile Name=umemoto-wordpress-profile ^
    --security-group-ids sg-xxxxx ^
    --subnet-id subnet-xxxxx ^
    --private-ip-address 10.0.1.50 ^
    --capacity-reservation-specification CapacityReservationPreference=none ^
    --tag-specifications "ResourceType=instance, Tags=[{Key=Name,Value=iamrole-test}]"

出力は省略します。

③EC2が起動したらSSHでログインした後、以下のコマンドを使用してファイルを作成します。

touch test.txt

④ファイルの作成ができたら以下のコマンドで作成したファイルをS3に転送します。(ここで権限を設定していないと転送に失敗します)

aws s3 cp test.txt s3://ut-wordpress-s3

⑤以下のコマンドを利用して転送できたかを確認します。

aws s3 ls s3://ut-wordpress-s3

file
確認できました。

次にインスタンス側のファイルを削除してS3のファイルをコピーできるかの確認をします。

⑥インスタンス側の削除のため以下のコマンドを使用します。

rm test.txt

⑦削除できましたら以下のコマンドを使用してS3からファイルをコピーします。

aws s3 cp s3://ut-wordpress-s3/test.txt ./

⑧以下のコマンドを利用してコピーできているか確認します。

ls test.txt

file
確認できました。

⑨最後に以下のコマンドを使用してS3のファイルを削除します。

aws s3 rm s3://ut-wordpress-s3/test.txt

⑩以下のコマンドで削除できているかを確認します。

aws s3 ls s3://ut-wordpress-s3

file
確認できました。

6.感想

CLIからEC2にIAMロールをアタッチする場合、インスタンスプロファイルが必要なことを知らなかったためそこの理解に少し時間が掛かりましたが、CLIでIAMを利用する際の知識が深まって良かったです。

7.参照

AWS CLI Command Reference – iam
https://docs.aws.amazon.com/cli/latest/reference/iam/index.html#cli-aws-iam

Last modified: 2022-06-09

Author