AWS-CLIでのクロスアカウントアクセスの実装めも

#やりたいこと

**AWS-CLIでクロスアカウントアクセスで操作したい　※MFA認証あり**

詳細は、こんな感じです。
①AWS-CLIの実行環境は、VirtualBoxで稼働中のCentOS8
②踏み台のAWSアカウント①(111111111111)を経由して、AWSアカウント②(222222222222)でAWS-CLIで操作をする環境を構築
※踏み台アカウントの一般ユーザ「qiita」には、MFA認証が設定されている。

※イメージ図
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/bfe0810c-71f6-a17d-e50e-de5ce9bea097.jpeg)


#前提条件

* AWS-CLI2の実行環境は、以下である。

```php
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 8.3.2011
```

* 一般ユーザqiitaは、EC2インスタンスを操作する全権限を既に設定済み


#実施手順

##(1)AWS-CLI2の実行環境構築

本手順は、このURLの通り実施いたしました。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html

▼最新のAWS-CLI2をダウンロード

```
# wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
```

▼ダウンロードファイルを解凍する

```
# unzip awscli-exe-linux-x86_64.zip
```

▼AWS-CLI2のインストール

```
# sudo ./aws/install
```

▼AWS-CLIのバージョン確認

```
# aws --version
```

※ここで、バージョンが表示されればOK

```
[root@localhost ~]# aws --version
aws-cli/2.1.19 Python/3.7.3 Linux/4.18.0-240.1.1.el8_3.x86_64 exe/x86_64.centos.8 prompt/off
```

↑今回のAWS-CLI2の実行環境です。

##(2)AWSアカウント①でのAWS-CLIのセットアップ

▼AWS-CLIのセットアップを実施

```
# aws configure
↓以下、入力項目で設定を実施する
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: 
```

以下、項目説明


| 入力項目    | 概要            | 
|:-----------|:----------------|
| AWS Access Key ID [None]     | アクセスキー |
| AWS Secret Access Key [None] |  シークレットアクセスキー |
| Default region name [None]:  |    デフォルトのリージョン <br>※東京リージョンを指定したい場合は、「ap-northeast-1」を指定 |
| Default output format [None]:|結果の形式を指定(例：json) |
--------------------------------------------------------------------

▼AWS-CLI設定後の動作テスト(EC2インスタンスの一覧を出力)

```
[root@localhost ~]#  aws ec2 describe-instances 
{
    "Reservations": []
}
```

※今回は、東京リージョンでEC2インスタンスが存在していないのでこのような出力結果になったが、EC2インスタンスが存在する場合はその情報が出力される。


##(3)クロスアカウントアクセス設定

###(3.1)AWSアカウント②でクロスアカウントアクセスを許可するロールを作成

▼AWSアカウント②のコンソールにログインし、ロールの作成を押下する。

▼以下を指定する　※画像参照

|操作対象|値|
|:---|:---|
|エンティティの種類|別のAWSアカウント|
|アカウントID|111111111111|
|MFAが必要|レ点チェック|



![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/db6fd668-2966-83c0-a6ed-ccceb4e8132a.png)

▼既存のポリシー「AdministerAccess」を選択
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/aa109edf-c037-04e7-9c33-b542c6ce18bc.png)

▼タグは特に設定せずに次へ
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/5d33fa05-2e0e-5f3e-18f3-91b9f1a97f78.png)

▼ロール名に「QiitaAccess」を入力し、ロールを作成する。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/ed3876dd-7c1a-13ac-3ac4-2d5d28f8d0a3.png)

###(3.2)AWSアカウント①でクロスアカウントアクセスの接続テストをおこなう

▼一般ユーザqiitaで、コンソールにログインする

▼ユーザタブから、「ロールの切り替え」を押下する。　※画像参照
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/47a68e57-8549-a548-655b-e515bdf5f19b.png)

▼以下を指定し、「ロールの切り替え」を実行する。　※画像参照

|入力項目|値|
|:---|:---|
|アカウント|222222222222|
|ロール|QiitaAccess|

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/884e9568-87d3-7d70-33a1-d94bf4c9aa97.png)


▼クロスアカウントアクセス後は、こんな感じの表示となります

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/28d18d9b-f3b3-015e-2f96-059ff8d636b6.png)

※ここまで実施できれば、AWSアカウント②でコンソールでの操作はできるようになりました。

##(4)AWS-CLIでのクロスアカウントアクセス設定

▼AWS-CLIの現在の設定値を確認

```
[root@localhost ~]# cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
```

※AWSアカウント①のAWS-CLIのアクセス情報があります。

▼「~/.aws/config」ファイルに設定情報を追記

```~/.aws/config
[profile qiita-cros]
region = ap-northeast-1
role_arn = arn:aws:iam::222222222222:role/QiitaAccess
mfa_serial = arn:aws:iam::111111111111:mfa/qiita
source_profile = default
```

|入力項目|値|
|:---|:---|
|region|EC2などを操作する際に必要な設定であり、リージョンを明示的に指定する必要がある|
|role_arn|AWSアカウント②のクロスアカウントロールを指定|
|mfa_serial|AWSアカウント①のMFA設定済みのqiitaユーザを指定|
|source_profile|AWSアカウント①のプロファイル内の認証情報を使用するために必要な設定|


▼AWS-CLI設定後の動作テスト(EC2インスタンスの一覧を出力)

```
[root@localhost ~]# aws ec2 describe-instances  --profile qiita-cros
Enter MFA code for arn:aws:iam::111111111111:mfa/qiita:
{
    "Reservations": []
}
```

実行時にMFAコードを聞かれるので、それを入力し、実行すれば、AWSアカウント②でもAWS-CLIの操作ができるようになりました!!やったね( *´艸｀)

#まとめ

コンソールでのクロスアカウントアクセスは、普通にできていたが、AWS-CLIでのクロスアカウントアクセスは少し手間取ってしまったので、記事に残してみました。
誰かのお役に立てたらうれしいです(●´ω｀●)　おわり


#追記　2021/01/18

* 毎回、コマンドの実行時に「--profile プロファイル名」を指定するのがめんどくさい場合は、環境変数に登録すると一回で済むから、楽になります。

```
export AWS_DEFAULT_PROFILE=プロファイル名
```