この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回は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.フロー図
-
下記で作成したポリシーをアタッチしたEC2用のIAMロールを作成します。
-
CloudWatchの権限を設定したポリシーを作成して、インスタンスのカスタムメトリクスを登録できるようにします。
-
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
確認できました。
次にインスタンス側のファイルを削除してS3のファイルをコピーできるかの確認をします。
⑥インスタンス側の削除のため以下のコマンドを使用します。
rm test.txt
⑦削除できましたら以下のコマンドを使用してS3からファイルをコピーします。
aws s3 cp s3://ut-wordpress-s3/test.txt ./
⑧以下のコマンドを利用してコピーできているか確認します。
ls test.txt
確認できました。
⑨最後に以下のコマンドを使用してS3のファイルを削除します。
aws s3 rm s3://ut-wordpress-s3/test.txt
⑩以下のコマンドで削除できているかを確認します。
aws s3 ls s3://ut-wordpress-s3
確認できました。
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