AWS CLIでサービスの各種コマンドを動かしてみる(IAM編3: ロール)
IAM編第3弾。今回はロール(role)及びロールポリシー(role-policy)に関するコマンド群です。
IAM:ロール(role)に関する操作
ロールに関するaws-cliのコマンドは以下6個。
get-role create-role list-roles delete-role add-role-to-instance-profile remove-role-from-instance-profile
ロールとは
IAMとロールの関連については、以下の情報が詳しいです。
- ロールを使用した API アクセスの委任 - AWS Identity and Access Management
- Amazon EC2 インスタンスで実行されるアプリケーションに、AWS リソースへのアクセスを付与する - AWS Identity and Access Management
- クロスアカウント API アクセスを有効にする - AWS Identity and Access Management
- クロスアカウント API アクセスを有効にするためのウォークスルー - AWS Identity and Access Management
グループにもユーザーにもアクセス権限は割り当てられるけれども、ロールを作成し、ロールにアクセス権限情報を割り当てる事でロールに対しAPIアクセス権限を委任出来、より制御や管理ががスムーズに、楽になるという認識で良いのかな?
get-role
create-roleから始めようと思ったけど、コマンドの引数で要求される"--assume-role-policy-document
aws-cliコマンドで確認してみます。"AssumeRolePolicyDocument"の内容はどうやらURLエンコードされているようですね。
{ "Role": { "AssumeRolePolicyDocument": "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%22%22%2C%22Effect%22%3A%22Allow%22%2C%22Principal%22%3A%7B%22Service%22%3A%22ec2.amazonaws.com%22%7D%2C%22Action%22%3A%22sts%3AAssumeRole%22%7D%5D%7D", "RoleId": "AROAIUPBHZQNUI73HZF3M", "CreateDate": "2013-07-04T09:11:45Z", "Path": "/", "RoleName": "aws-test-role", "Arn": "arn:aws:iam::317282958305:role/aws-test-role" }, "ResponseMetadata": { "RequestId": "8de9ddf4-e48a-11e2-a0fa-2ba949bc0794" } }
create-role
ロールを作成します。
上述のget-roleコマンドで表示されている"AssumeRolePolicyDocument"の内容が必要なのかな、と思いまずはそのまま引数に渡してみました。結果はNG。
$ aws iam create-role --role-name aws-test-another-role --assume-role-policy-document "%7B%22Version(中略)AssumeRole%22%7D%5D%7D" { "Errors": [ { "Message": "Syntax errors in policy.", "Code": "MalformedPolicyDocument", "Type": "Sender" } ], "Role": {}, "ResponseMetadata": { "RequestId": "57e4904c-e48b-11e2-ba36-0f251103ce0b" } }A client error (MalformedPolicyDocument) occurred: Syntax errors in policy.
次に、『ポリシーファイルっつう位だからグループやユーザーを作成する時に使うポリシーファイルを流用出来るんじゃね?』と思い、GUIで作ったファイルをjsonファイルとして保存、読みこませて見ることに。
$ sudo vi s3fullAccessPolicy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }
実行してみるもまたもNG。プリンシパル(principal)を含んでいないとダメらしいです。
$ aws iam create-role --role-name aws-test-another-role --assume-role-policy-document file://s3fullAccessPolicy.json { "Errors": [ { "Message": "AssumeRole policy must contain principals.", "Code": "MalformedPolicyDocument", "Type": "Sender" } ], "Role": {}, "ResponseMetadata": { "RequestId": "d0135091-e48b-11e2-9d6d-0b5035168c31" } }A client error (MalformedPolicyDocument) occurred: AssumeRole policy must contain principals.
該当部分の文字列をデコードし、整形してみます。似ているようで違ってますね。こちらのドキュメントで言及されている、『IAM ユーザーがロールを引き受けるには、そのロールを対象に sts:AssumeRole を呼び出す権限が付与されている必要があります。』と紐付く情報のようです。
(Groovy) println URLDecoder.decode("%7B%22Version%22(中略)AssumeRole%22%7D%5D%7D","UTF-8"); {"Version":"2008-10-17","Statement":[{"Sid":"","Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]} (整形後の内容) { "Version":"2008-10-17", "Statement":[ { "Sid":"", "Effect":"Allow", "Principal":{ "Service":"ec2.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
管理コンソールを確認してみると、こちらの内容はTrust Relationshipsタブの以下の内容になっている模様。半角空白や改行文字が除去された状態でURLエンコードされてるっぽいです。
ファイルとして管理コンソールの表示内容を保存。
$ vi policyDocument.json { "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
そしてファイル参照形式でコマンド実行。上手く作成出来ました。
$ aws iam create-role --role-name aws-xyz-role --assume-role-policy-document file://policyDocument.json { "Role": { "AssumeRolePolicyDocument": "%7B%0A%20%20%22Version%22%3A%20%222008-10-17%22%2C%0A%20%20%22Statement%22%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22Sid%22%3A%20%22%22%2C%0A%20%20%20%20%20%20%22Effect%22%3A%20%22Allow%22%2C%0A%20%20%20%20%20%20%22Principal%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22Service%22%3A%20%22ec2.amazonaws.com%22%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%22Action%22%3A%20%22sts%3AAssumeRole%22%0A%20%20%20%20%7D%0A%20%20%5D%0A%7D%0A", "RoleId": "AROAJ7MUTNASDC4JUG5WG", "CreateDate": "2013-07-04T14:30:28.127Z", "Path": "/", "RoleName": "aws-xyz-role", "Arn": "arn:aws:iam::317282958305:role/aws-xyz-role" }, "ResponseMetadata": { "RequestId": "45b61e0f-e4b6-11e2-9d6d-0b5035168c31" } }
list-roles
ロールの一覧を取得します。--path-prefixで特定のパスを指定した場合は該当するパス情報を持つロールを前方一致で検索します。
$ aws iam list-roles | jq '.[].RoleName' "aws-test-role" "aws-test-role-2" "aws-test-role-3"
返却される情報に含まれるポリシー情報はRFC3986にもとづき、URLエンコーディングされた状態で表示されます。
$ aws iam list-roles | jq '.[].AssumeRolePolicyDocument' "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22(後略)" "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22(後略)" "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22(後略)" $
delete-role
ロールを削除します。
ロール名のみ指定で実行すると、以下の様にエラーとなりました。事前にインスタンスのプロファイルからロールを削除する必要が有るようです。
$ aws iam delete-role --role-name aws-role-for-delete { "Errors": [ { "Message": "Cannot delete entity, must remove roles from instance profile first.", "Code": "DeleteConflict", "Type": "Sender" } ], "ResponseMetadata": { "RequestId": "e817442c-e4ad-11e2-9d6d-0b5035168c31" } }A client error (DeleteConflict) occurred: Cannot delete entity, must remove roles from instance profile first.
インスタンスのプロファイル情報を確認してみましょう。get-instance-profileコマンドで、--instance-profile-nameにロール名を指定する事で取得出来ます。
$ aws iam get-instance-profile --instance-profile-name aws-role-for-delete { "InstanceProfile": { "InstanceProfileId": "AIPAIIF4TAK4I7TBAIQXI", "Roles": [ { "AssumeRolePolicyDocument": "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%22%22%2C%22Effect%22%3A%22Allow%22%2C%22Principal%22%3A%7B%22Service%22%3A%22ec2.amazonaws.com%22%7D%2C%22Action%22%3A%22sts%3AAssumeRole%22%7D%5D%7D", "RoleId": "AROAIYRVW47SYWKK7ERNY", "CreateDate": "2013-07-04T13:30:05Z", "Path": "/", "RoleName": "aws-role-for-delete", "Arn": "arn:aws:iam::317282958305:role/aws-role-for-delete" } ], "CreateDate": "2013-07-04T13:30:05Z", "InstanceProfileName": "aws-role-for-delete", "Path": "/", "Arn": "arn:aws:iam::317282958305:instance-profile/aws-role-for-delete" }, "ResponseMetadata": { "RequestId": "0098eaca-e4ae-11e2-9d6d-0b5035168c31" } }
プロファイルからロールを消してみます。ロール名もプロファイル名も同じ名前?で行けるようです。
$ aws iam remove-role-from-instance-profile --role-name aws-role-for-delete --instance-profile-name aws-role-for-delete { "ResponseMetadata": { "RequestId": "51fd66a5-e4ae-11e2-a0fa-2ba949bc0794" } }
改めてinstanceプロファイルの内容を確認してみましょう。ロール(Roles)の内容が消えています。
$ aws iam get-instance-profile --instance-profile-name aws-role-for-delete { "InstanceProfile": { "InstanceProfileId": "AIPAIIF4TAK4I7TBAIQXI", "Roles": [], "CreateDate": "2013-07-04T13:30:05Z", "InstanceProfileName": "aws-role-for-delete", "Path": "/", "Arn": "arn:aws:iam::317282958305:instance-profile/aws-role-for-delete" }, "ResponseMetadata": { "RequestId": "6fbaed57-e4ae-11e2-8fe2-a91a74ec1b95" } }
改めての削除コマンド実施…あれ?また別のエラーが。つーか『まず最初に(first)』ってさっきも言ってなかったっけ?w
$ aws iam delete-role --role-name aws-role-for-delete { "Errors": [ { "Message": "Cannot delete entity, must delete policies first.", "Code": "DeleteConflict", "Type": "Sender" } ], "ResponseMetadata": { "RequestId": "dec0dcff-e4ae-11e2-af3f-f58037e41cee" } }A client error (DeleteConflict) occurred: Cannot delete entity, must delete policies first.
ポリシーも削除。delete-role-policyコマンドでロール及び削除したいポリシー名を指定します。GUIで作ったロールなのでポリシー名も割と長目な感じになってます。
$ aws iam delete-role-policy --role-name aws-role-for-delete --policy-name PowerUserAccess-aws-role-for-delete-201307042229 { "ResponseMetadata": { "RequestId": "557ea93b-e4af-11e2-8752-c73aa4f68d6d" } }
今度こそ、消えました!ロールの削除には事前に幾つか行なっておく事があるようですね。
$ aws iam delete-role --role-name aws-role-for-delete { "ResponseMetadata": { "RequestId": "9241037e-e4af-11e2-8a03-a9df50e5b4b7" } }
add-role-to-instance-profile
この項については後日、インスタンスプロファイルに関するエントリで試してみた後で触れてみたいと思います。
remove-role-from-instance-profile
プロファイルからロールを削除します。
$ aws iam remove-role-from-instance-profile --role-name aws-role-for-delete --instance-profile-name aws-role-for-delete { "ResponseMetadata": { "RequestId": "51fd66a5-e4ae-11e2-a0fa-2ba949bc0794" } }
この『プロファイル』という概念、ちょっとまだ自分の中では理解が曖昧なので別のエントリにてもう少し掘り下げて取り組んで見ようと思います。
IAM:ロールポリシー(role-policy)に関する操作
ロールポリシーに関するaws-cliのコマンドは以下6個。
put-role-policy get-role-policy list-role-policies delete-role-policy
put-role-policy
ポリシー情報を追加します。利用するポリシー情報はグループ、ユーザーのものと同じ書式です。
$ vi PowerUserAccess.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "NotAction": "iam:*", "Resource": "*" } ] }
2つポリシーファイルを登録してみました。管理コンソールでもちゃんと見えています。
$ aws iam put-role-policy --role-name aws-xyz-role --policy-name PowerUserAccessPolicy --policy-document file://PowerUserAccess.json $ aws iam put-role-policy --role-name aws-xyz-role --policy-name VPCFullAccesPolicy --policy-document file://VPCFullAccwssPolicy.json
get-role-policy
ポリシー情報を取得します。
$ aws iam get-role-policy --role-name aws-xyz-role --policy-name VPCFullAccesPolicy { "RoleName": "aws-xyz-role", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:AllocateAddress", "ec2:AssociateAddress", "ec2:AssociateDhcpOptions", "ec2:AssociateRouteTable", : (中略) : "ec2:ReplaceNetworkAclAssociation", "ec2:ReplaceNetworkAclEntry", "ec2:ReplaceRouteTableAssociation", "ec2:RevokeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress" ], "Resource": "*", "Effect": "Allow" } ] }, "ResponseMetadata": { "RequestId": "11debabb-e4bc-11e2-805f-95793b858121" }, "PolicyName": "VPCFullAccesPolicy" }
list-role-policies
ロールに紐付くポリシーの一覧を取得します。
$ aws iam list-role-policies --role-name aws-xyz-role [ "PowerUserAccessPolicy", "VPCFullAccesPolicy" ]
delete-role-policy
任意のロールポリシーを削除します。
$ aws iam delete-role-policy --role-name aws-xyz-role --policy-name VPCFullAccesPolicy { "ResponseMetadata": { "RequestId": "94a175a3-e4bc-11e2-885e-7117b4d431d8" } }