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

2013.08.30

AWS SDKには数多くのAPIやライブラリツールが提供されていますが、個人的にはAWS Command Line Interface(aws-cli)が使い勝手が良いなぁ〜、と思ってたりします。その理由はポイントはコード補完が効き、そのサービスで利用出来るコマンドの全容、ひいては『どのような要素があり、どのような操作が出来るのか』といった点が把握しやすい点があるからです。

aws-cli以外の各種APIにもドキュメントはありますが、一覧性(1画面内に要素が大体収まる)、即興性(コマンド実行で直ぐ出る、ヘルプもコマンドで利用可能)等を考えると、リファレンスとしての使い勝手としても良い方なのではないでしょうか。(と個人的には思っております)

ここでは、その『aws-cli』を主に用いて、AWSのサービスや機能について少しずつ紐解いていき、理解を深めて行きたいと思います。aws-cli自体、まだDeveloper Preview版と言う事もあるので、ひとまずはざっくり以下の様な流れで進めて行こうかなと。

  • aws-cliのコマンド一覧から全容を把握する
  • aws-cliを使って様々なコマンドを実践してみる
  • aws-cliは現時点でプレビュー版(Developer Preview)の為、多分意図・想定通りに動かない(または動かし方が分からない)場合もあると思うので、その辺躓いた部分も何らかの形で記録として残す
  • aws-cliで実行出来なかった部分・情報収集し切れなかった部分に関しては、手軽さ、使い易さを考慮してAWS SDK for JavaでGroovy経由で別途触って理解を深めてみる

ではでは、まず最初のエントリ。IAMについてです。

IAM(Identify and Access Management)

AWS Identity and Access Management (IAM) Preview Beta | アマゾン ウェブ サービス(AWS 日本語)

IAMは、AWSでユーザーとユーザーのアクセス権限を管理出来るようにするサービスです。ユーザー、グループ、ロール等の特定エンティティに対し、『ポリシー』という所定の書式に従った、1つ以上のアクセス権限を記述したドキュメントを用いる事によって柔軟な制御・管理を行う事が出来ます。

awscliでiamのコマンドを見てみましょう。2013年07月頭現在で合計69個提供されています。

$ aws iam
add-role-to-instance-profile       delete-user                        list-role-policies
add-user-to-group                  delete-user-policy                 list-roles
change-password                    delete-virtual-mfa-device          list-server-certificates
create-access-key                  enable-mfa-device                  list-signing-certificates
create-account-alias               get-account-password-policy        list-user-policies
create-group                       get-account-summary                list-users
create-instance-profile            get-group                          list-virtual-mfa-devices
create-login-profile               get-group-policy                   put-group-policy
create-role                        get-instance-profile               put-role-policy
create-user                        get-login-profile                  put-user-policy
create-virtual-mfa-device          get-role                           remove-role-from-instance-profile
deactivate-mfa-device              get-role-policy                    remove-user-from-group
delete-access-key                  get-server-certificate             resync-mfa-device
delete-account-alias               get-user                           update-access-key
delete-account-password-policy     get-user-policy                    update-account-password-policy
delete-group                       list-access-keys                   update-assume-role-policy
delete-group-policy                list-account-aliases               update-group
delete-instance-profile            list-group-policies                update-login-profile
delete-login-profile               list-groups                        update-server-certificate
delete-role                        list-groups-for-user               update-signing-certificate
delete-role-policy                 list-instance-profiles             update-user
delete-server-certificate          list-instance-profiles-for-role    upload-server-certificate
delete-signing-certificate         list-mfa-devices                   upload-signing-certificate
$

そしてここからは上記コマンドを処理対象要素別に振り分け、要素別にそれぞれ紐解いて行こうと思います。

なお、エントリで処理対象となる"キーワード"についてはこの辺りの公式ページが詳しかったりします。

IAM:グループ(group)に関する操作

グループに関するaws-cliのコマンドは以下6個。

create-group
delete-group
get-group
list-groups
list-groups-for-user
update-group

グループとは、AWSに於ける同じような責任を持つユーザをひとまとめにしたもの。コマンドを見てみてもシンプルにグループに関する操作が提供されているようですね。

 

create-group

グループを作成。最低限、グループ名の指定だけで作成する事が出来ます。

$ aws iam create-group --group-name awscli-iam-group
{
    "Group": {
        "Path": "/", 
        "CreateDate": "2013-07-02T13:45:44.288Z", 
        "GroupId": "AGPAIRFH66PUNROSHQ3XK", 
        "Arn": "arn:aws:iam::317282958305:group/awscli-iam-group", 
        "GroupName": "awscli-iam-group"
    }, 
    "ResponseMetadata": {
        "RequestId": "b12e89de-e31d-11e2-af3f-f58037e41cee"
    }

 

delete-group

指定のグループを削除。こちらもグループ名指定のみ。

$ aws iam delete-group --group-name awscli-iam-group
{
    "ResponseMetadata": {
        "RequestId": "e8a9b963-e31d-11e2-805f-95793b858121"
    }
}

ちなみに存在しないグループ名を指定した場合は以下のように怒られます。

$ aws iam delete-group --group-name no-exist-group
{
    "Errors": [
        {
            "Message": "The group with name no-exist-group cannot be found.", 
            "Code": "NoSuchEntity", 
            "Type": "Sender"
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "16e497c8-e31e-11e2-ba36-0f251103ce0b"
    }
}A client error (NoSuchEntity) occurred: The group with name no-exist-group cannot be found.

 

get-group

グループ情報を取得。グループ名を引数に取り、結果としてグループ情報を受け取ります。

以下のようにGroovyで実行してみると、ちゃんと結果を受け取れるのですが…(※getInstance()メソッドでCredential情報を設定したIAMクライアントインスタンスを取得しています)

(IAMUtil.groovyクラスに実装したメソッド)
public static Group createGroup(String groupName) {
    CreateGroupRequest createGroupRequest = new CreateGroupRequest().withGroupName(groupName);
    CreateGroupResult result = getInstance().createGroup(createGroupRequest);
    return result.group;
}
------------------
(実行)
IAMUtil.createGroup("iam-test-group");
Group group = IAMUtil.getGroup("iam-test-group");
println "groupId   :" + group.groupId;
println "groupName :" + group.groupName;
println "arn       :" + group.arn;
println "path      :" + group.path;
println "createDate:" + group.createDate;
------------------
(結果)
groupId   :AGPAICGLWQWNZMPTKJCW4
groupName :iam-test-group
arn       :arn:aws:iam::317282958305:group/iam-test-group
path      :/
createDate:Tue Jul 02 23:01:11 JST 2013

aws-cliで実行してみると、なぜか空?の状態で帰って来ます。メソッド名的には単数形(で結果が返ってくる)なのだとは思いますがヘルプに復数件数取得で使うであろうパラメータがあるのも気になると言えば気になるところです。

$ aws iam get-group --group-name iam-test-group

[
    "Path", 
    "CreateDate", 
    "GroupId", 
    "Arn", 
    "GroupName"
]

 

list-groups

特定のプレフィックス文字列に該当するグループ名称の一覧を取得します。グループの属性情報の1つである『パス(path)』をプレフィックス文字列で検索する事も出来るようです。

$ aws iam list-groups | jq length
7
$ aws iam list-groups --path-prefix /home/
[
    {
        "Path": "/home/dev/", 
        "CreateDate": "2013-07-02T02:25:26Z", 
        "GroupId": "AGPAI4VUDQKORDUBVM5NM", 
        "Arn": "arn:aws:iam::317282958305:group/home/dev/iam-group-test", 
        "GroupName": "iam-group-test"
    }
]

 

list-groups-for-user

ユーザーが所属するグループの一覧を取得します。管理コンソール経由で、以下の様なグループとユーザーをまず作ってみました。user-eが復数グループに所属する形となっています。

ec2usergroups3usergroup

user-a/user-eそれぞれでコマンドを実行してみます。

$ aws iam list-groups-for-user --user-name user-a | jq ".[].GroupName"
"ec2usergroup"
$ aws iam list-groups-for-user --user-name user-e | jq ".[].GroupName"
"ec2usergroup"
"s3usergroup"

 

update-group

グループ情報に関する更新を行います。コマンドヘルプを見ると、以下2点の更新が行えるようです。

  • パス(new-path)
  • グループ名(new-group-name)
$ aws iam create-group --group-name iam-group-for-update  (更新用のグループを作成)
{
    "Group": {
        "Path": "/", 
        "CreateDate": "2013-07-02T14:42:00.758Z", 
        "GroupId": "AGPAIJNBFVT7M4AAIPHHK", 
        "Arn": "arn:aws:iam::317282958305:group/iam-group-for-update", 
        "GroupName": "iam-group-for-update"
    }, 
    "ResponseMetadata": {
        "RequestId": "8dacbfcc-e325-11e2-8752-c73aa4f68d6d"
    }
}
$ aws iam update-group --group-name iam-group-for-update --new-path /home/divA/divB/  (パス情報を更新)
{
    "ResponseMetadata": {
        "RequestId": "ad138950-e325-11e2-8752-c73aa4f68d6d"
    }
}
$ aws iam list-groups --path-prefix /home/div  (更新したパスで検索を行い、該当のグループが引っ張れる事を確認)
[
    {
        "Path": "/home/divA/divB/",
        "CreateDate": "2013-07-02T14:42:00Z", 
        "GroupId": "AGPAIJNBFVT7M4AAIPHHK", 
        "Arn": "arn:aws:iam::317282958305:group/home/divA/divB/iam-group-for-update", 
        "GroupName": "iam-group-for-update"
    }
]
$ aws iam update-group --group-name iam-group-for-update --new-group-name iam-group-updated  (グループ名の更新)
{
    "ResponseMetadata": {
        "RequestId": "024eff4c-e326-11e2-8fe2-a91a74ec1b95"
    }
}
$ aws iamlist-groups --path-prefix /home/div  (改めてパス情報で検索、グループ名が変わっている事を確認)
[
    {
        "Path": "/home/divA/divB/", 
        "CreateDate": "2013-07-02T14:42:00Z", 
        "GroupId": "AGPAIJNBFVT7M4AAIPHHK", 
        "Arn": "arn:aws:iam::317282958305:group/home/divA/divB/iam-group-updated", 
        "GroupName": "iam-group-updated"
    }
]
$

IAM:グループポリシー(group-policy)に関する操作

グループポリシーに関するaws-cliのコマンドは以下5個。

put-group-policy						
get-group-policy
delete-group-policy
list-group-policies

ポリシーとは、所定の書式に従った、1つ以上のアクセス権限を記述したドキュメントを指します。書き方の解説は以下公式ドキュメントをご参照ください。

という事なので、グループポリシーはこれらアクセス権限制御情報がグループに紐付たものになる訳ですね。

 

put-group-policy

グループにポリシーを付加します。管理コンソール上では[Permissions]タブからGUIで追加、編集が可能ですが、ここではそれらの操作をAPI経由で試してみます。適当なグループを作成し、ポリシードキュメントの雛型が表示されたら、その内容をコピペして別途テキストファイルに保存しておきます。ここではjsonファイルとしました。

$ vi PowerUserAccess.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "NotAction": "iam:*",
      "Resource": "*"
    }
  ]
}

aws-cliでは、JSON形式のファイル(リストや構造化された状態のもの)に関しては、ファイル参照やURL参照の形でコマンド引数に利用する事が出来ます。上記で作成したファイルをfile://形式で参照させ、コマンド実行。

aws iam put-group-policy --group-name powerusergroup --policy-document file://PowerUserAccess.json --policy-name Policy-PowerUserAccess
{
    "ResponseMetadata": {
        "RequestId": "9194f95d-e334-11e2-8fe2-a91a74ec1b95"
    }
}
$ 

ちゃんと更新されていますね。Groovyではこんな感じ。参照するポリシーファイルは同じものを利用しています。

Class IAMUtil {
    :
    :
    public static void putGroupPolicy(String groupName, String policyName, String policyFilePath) {
        PutGroupPolicyRequest putGroupPolicyRequest = new PutGroupPolicyRequest()
            .withGroupName(groupName)
            .withPolicyName(policyName)
            .withPolicyDocument(policyFile.getText());
        getIamInstance().putGroupPolicy(putGroupPolicyRequest);
    }
}
---------
IAMUtil.putGroupPolicy("powerusergroup","PolicyPowerUserAccess","/Users/xxxx/aws/Policy-PowerUserAccess.json");

 

get-group-policy

グループポリシー情報を取得。グループ名及びポリシー名を指定します。

$ aws iam get-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess
{
    "GroupName": "powerusergroup", 
    "PolicyDocument": {
        "Version": "2012-10-17", 
        "Statement": [
            {
                "NotAction": "iam:*", 
                "Resource": "*", 
                "Effect": "Allow"
            }
        ]
    }, 
    "ResponseMetadata": {
        "RequestId": "14baceeb-e372-11e2-af3f-f58037e41cee"
    }, 
    "PolicyName": "PolicyPowerUserAccess"
}

 

delete-group-policy

ポリシーを削除します。ポリシーにエンティティが紐付けられていた場合エラーとなりますので事前にエンティティの削除が必要となります。

$ aws iam delete-group --group-name powerusergroup
{
    "Errors": [
        {
            "Message": "Cannot delete entity, must delete policies first.", 
            "Code": "DeleteConflict", 
            "Type": "Sender"
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "1a15ef24-e375-11e2-805f-95793b858121"
    }
}A client error (DeleteConflict) occurred: Cannot delete entity, must delete policies first.

$ aws iam list-group-policies --group-name powerusergroup
[
    "PolicyPowerUserAccess", 
    "PolicyPowerUserAccess2nd"
]
$ aws iam delete-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess
{
    "ResponseMetadata": {
        "RequestId": "bdcaf5d9-e375-11e2-8fe2-a91a74ec1b95"
    }
}
$ aws iam delete-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess2nd
{
    "ResponseMetadata": {
        "RequestId": "c1c0e897-e375-11e2-8a03-a9df50e5b4b7"
    }
}
$ aws iam delete-group --group-name powerusergroup
{
    "ResponseMetadata": {
        "RequestId": "cf5c561f-e375-11e2-885e-7117b4d431d8"
    }
}
$ 

 

list-group-policies

グループに設定されているポリシー名の一覧を取得します。

$ aws iam list-group-policies --group-name sample-admins-group
[
    "AmazonDynamoDBFullAccess-sample-admins-group-201307030906", 
    "AmazonElastiCacheFullAccess-sample-admins-group-201307030907", 
    "AmazonRedshiftFullAccess-sample-admins-group-201307030907", 	
    "AmazonS3FullAccess-sample-admins-group-201307030906"
]

まとめ

以上、IAMのグループに関するAWS CLIコマンドでした。このシリーズは不定期ではありますが、更新出来る時に適宜更新して行きたいと思います。目指すは全サービス全コマンド制覇!ですが、一体いつの話になることやら...w 首を長〜くして生暖かい目で見て頂ければと思います。また実践内容についても状況が変わった(出来なかったものが出来るようになった、または逆のパターン等)場合についても、判明次第該当箇所の更新は行っていこうと思います。よろしくお願いします。