AWS CLIでスイッチロール(AssumeRole)する際のステップ削減

# 経緯

標準の？方法はコピペ工数が多く面倒に感じました。

## 標準の方法

AWS CLIでスイッチロールするには標準で以下になります。
※スイッチロールできる設定は済んでいる前提です。

1. スイッチロールしたいAWSアカウントの認証情報を取得するコマンドを実施

    ```
    $ aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" 
    ```

    
    
    出力される結果　※[公式サンプル](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html)

    ```
    {
        "AssumedRoleUser": {
            "AssumedRoleId": "AROA3XFRBF535PLBIFPI4:s3-access-example",
            "Arn": "arn:aws:sts::123456789012:assumed-role/xaccounts3access/s3-access-example"
        },
        "Credentials": {
            "SecretAccessKey": "9drTJvcXLB89EXAMPLELB8923FB892xMFI",
            "SessionToken": "AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=",
            "Expiration": "2016-03-15T00:05:07Z",
            "AccessKeyId": "ASIAJEXAMPLEXEG2JICEA"
        }
    }
   ```

2. 1の結果からアクセスキー、シークレットアクセスキー、トークンをコピーし環境変数に設定
    ※コマンドのコピーと値のコピーで2回。アクセスキーとシークレットアクセスキー、トークンがあるのでトータル6回のコピペが必要。

    ```
    $ export AWS_ACCESS_KEY_ID=ASIAJEXAMPLEXEG2JICEA
    $ export AWS_SECRET_ACCESS_KEY=9drTJvcXLB89EXAMPLELB8923FB892xMFI
    $ export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of security token>
    ````

3. 意図した権限になっているかを以下のコマンドで確認

    ```
    $ aws sts get-caller-identity
    ``` 

## ステップ削減できる方法

1. 以下のコマンドを実施

    ```
    aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --query 'join(``,[`export AWS_ACCESS_KEY_ID=`,Credentials.AccessKeyId, `,export AWS_SECRET_ACCESS_KEY=`,Credentials.SecretAccessKey, `,export AWS_SESSION_TOKEN=`,Credentials.SessionToken])' --output text | tr ',' '\n'
    ```

    出力される結果
    
    ```
    export AWS_ACCESS_KEY_ID=ASIAJEXAMPLEXEG2JICEA
    export AWS_SECRET_ACCESS_KEY=9drTJvcXLB89EXAMPLELB8923FB892xMFI
    export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of security token>
    ```
2. 1で標準出力された内容をコピペする


3. 意図した権限になっているかを以下のコマンドで確認

    ```
    $ aws sts get-caller-identity
    ``` 

項目分けした結果どちらも3ステップになってしまいましたが、実際に作業された方であれば体感して頂けると思います。

## 説明
- aws sts assume-roleのコマンドを実施した際に出力される結果を選ぶ
    - --queryオプション
        - Credentials.AccessKeyId
        - Credentials.SecretAccessKey
        - Credentials.SessionToken

    - 上記のみ活用した場合のコマンド
    
    ```
    aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --query '[Credentials.AccessKeyId, Credentials.SecretAccessKey, Credentials.SessionToken]'
    ```

    出力される結果

    ```
    ASIAJEXAMPLEXEG2JICEA    9drTJvcXLB89EXAMPLELB8923FB892xMFI    AQoDYXdzEJr...<remainder of security token>
    ```


- queryで出力した結果と環境変数にセットするコマンドを合わせて表示したい
    - join        
        - コマンド
        
        ```
        aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1"  --query 'join(``,[`export AWS_ACCESS_KEY_ID=`,Credentials.AccessKeyId, `export AWS_SECRET_ACCESS_KEY=`,Credentials.SecretAccessKey, `export AWS_SESSION_TOKEN=`,Credentials.SessionToken])' 
        ```


        理想は↓
    
        ```
        export AWS_ACCESS_KEY_ID=ASIAJEXAMPLEXEG2JICEA
        export AWS_SECRET_ACCESS_KEY=9drTJvcXLB89EXAMPLELB8923FB892xMFI
        export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of security token>
        ```
    
        実際は↓

        ```
        export AWS_ACCESS_KEY_ID=ASIAJEXAMPLEXEG2JICEAexport AWS_SECRET_ACCESS_KEY=9drTJvcXLB89EXAMPLELB8923FB892xMFIexport AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of security token>
        ```
        
        - 全てが一塊になってしまっている・・・

- 三行に分けたい
    - |tr ',' '\n'
        - 二個目と三個目のexportの前に,を入れる
        - trコマンドで,を改行文字に置換する。

        結果

        ```
        export AWS_ACCESS_KEY_ID=ASIAJEXAMPLEXEG2JICEA
        export AWS_SECRET_ACCESS_KEY=9drTJvcXLB89EXAMPLELB8923FB892xMFI
        export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of security token>
        ```

## まとめ
紹介したコマンドはAmazon linux2であれば追加パッケージが必要ない事も大きな利点になっています。

ロールする対象が多い為、上記を応用したシェルを作成し活用しています。
もっと効率の良い方法があるかもしれませんが、忘備録的に残しておきます。

## 参考にさせて頂いたページ
[AssumeRole で得られたクレデンシャルを環境変数に入れる](https://qiita.com/ngyuki/items/6a30b3bdb2ba605afe3c)