AWS CLIでCross-Account Accessを使う

これまでCross-Account Accessを使いたい場合にはSDKを使ったりしていたが、ちょっとしたコマンドを実行したいだけなのにSDKを使うのは面倒だなーという事で、AWS CLIだけでCross-Account Accessを使う方法を考えてみた。

用意するもの

  1. AWS CLI
  2. AssumeするアカウントのIAM User (ポリシーはSTSのAssumeRole権限のみ必要です)
  3. AssumeされるアカウントのIAM Role arn:aws:iam::222222222222:role/cross (上記アカウントをTrustしている必要があります)

詳しくはこちらを参照の事。

AssumeRoleのテストをしてみる

AssumeするアカウントのIAM UserのCredentialを設定した状態で、下記のようなコマンドを実行してみます。

$ aws sts assume-role --role-arn arn:aws:iam::222222222222:role/cross --role-session-name cross --output json
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAxxxxxxxxxxxxxxxx:cross",
        "Arn": "arn:aws:sts::222222222222:assumed-role/cross/cross"
    },
    "Credentials": {
        "SecretAccessKey": "****************************************",
        "SessionToken": "****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************",
        "Expiration": "2013-10-03T19:16:14Z",
        "AccessKeyId": "********************"
    }
}

上記のように、AccessKeyId、SecretAccessKey、SessionTokenが得られたらOKです。エラーが出る場合には、Policy設定などを見直しましょう。

実際にAPIコマンドを発行してみる

$ export AWS_ACCESS_KEY_ID=********************
$ export AWS_SECRET_ACCESS_KEY=****************************************
$ export AWS_SECURITY_TOKEN=****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ aws ec2 describe-instances
{
    "Reservations": [
        {
             :

APIコールがちゃんと出来ました。

全リージョンのインスタンスタイプ別台数を調べる

こちらのようなスクリプトで実行します https://gist.github.com/j3tm0t0/6814653 (要jq)

$ ./cross-count-instances.sh 222222222222
accountid: 222222222222
-- eu-west-1

-- sa-east-1

-- us-east-1

-- ap-northeast-1
   1 "t1.micro"

-- us-west-2

-- us-west-1

-- ap-southeast-1

-- ap-southeast-2||<

まとめ

jsonにでも吐いてweb上で見やすく整形してみたら素敵かもしれない。