AWS CLIでサービスの各種コマンドを動かしてみる(IAM編3: ロール)

2013.08.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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アクセス権限を委任出来、より制御や管理ががスムーズに、楽になるという認識で良いのかな?

get-role

create-roleから始めようと思ったけど、コマンドの引数で要求される"--assume-role-policy-document "の部分の理解が執筆時点でいまいちだったのでまずはGUIでロールを作成し、中身を確認してみることに。ウィザードに従い、適当なロールを作成してみました。

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

role-policy_01

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"
    }
}