【AWS Systems Manager】AWS CLIを用いてSSM経由でEC2インスタンスにアクセスしてみた

# 事前準備
本記事は、事前に以下設定がされていることを前提とします。
(a) IAMユーザーの設定（プログラムアクセスキー情報取得、MFA認証設定、各種IAMポリシー付与）
(b) AWS Systems Managerセッションマネージャーからの、EC2インスタンスへのセッション開始可能設定(別記事参照)
(c) ローカル環境にAWS CLIをインストール
(d) AWS CLI用のSession Manager Pluginをインストール

## (a) IAMユーザーの設定
後述の手順で必要なため、IAMユーザーの概要画面で、以下設定がされたIAMユーザーのARNを控えること

> AWSアカウントIDが「123456789012」で、IAMユーザー名が「ssm-user」の場合
> arn:aws:iam::123456789012:user/ssm-user

### (a-1) IAMユーザーの作成時に「プログラムによるアクセス」にチェックが入っていること
作成時に表示される「アクセスキーID」と「シークレットアクセスキー」を必ず控えること！！！

* 特に「シークレットアクセスキー」はこのタイミングでしか参照できないため要注意
 * 万が一このタイミングで取得を逃した場合、以下手順でアクセスキーの再作成が必要

> [IAM]->[アクセス管理]->[ユーザー]->[(対象ユーザー選択)]->[(概要画面から)認証情報]->「アクセスキーの作成」
     
- 【参考_1】IAMユーザー作成画面
![01_IAMユーザー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172282/e75f0491-86a1-c2eb-6a98-cad6f61382c1.png)
- 【参考_2】アクセスキーの取得画面
 ![02_アクセスキーを控えること.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172282/cc5c72ee-52e6-5940-efa3-1de113f8a84b.png)

### (a-2) MFA認証が設定されていること
IAMユーザーがログインする際に、MFA認証ができるように設定をすること（説明割愛）

* IAMユーザーに対するIAMポリシーアタッチ(MFA認証用途)や、スマホに「GoogleAuthenticator」等の認証アプリインストールが必要

### (a-3) 本記事で取り上げるAWSサービス利用に必要なIAMポリシーが設定されていること
本来はもっと絞るべきですが、本記事では以下権限を付与しています。

- AmazonEC2FullAccess
- AmazonS3FullAccess
- AmazonSSMFullAccess

## (b) AWS Systems Managerセッションマネージャーからの、EC2インスタンスへのセッション開始可能設定
以下記事の内容を参考に、EC2の設定を実施する。後述の手順で必要になるため、作成したEC2インスタンスの「instance-id」を控えておく。

- [【AWS Systems Manager】Privateサブネット内のEC2インスタンスにSSM経由でアクセスしてみた](https://qiita.com/shinaK/items/16aca2b06c9c1396537c)
  - Publicサブネットで実施したい場合は、Privateサブネットに関する記載を適宜読み替えてください。


## (c) ローカル環境にAWS CLIをインストール
以下公式サイトに従い、各環境に合わせてインストール

- [【AWS公式】AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
  - インストールが完了すると、コンソールで「aws」コマンドが使えるようになる。
  - 2020年5月時点だと、以下バージョンがインストールされる。

```markdown:aws-cliのバージョン確認
$ aws --version
aws-cli/2.0.10 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev14
```


## (d) AWS CLI用のSession Manager Pluginをインストール
以下公式サイトに従い、各環境に合わせてインストール

- [【AWS公式】(オプション) AWS CLI 用の Session Manager Plugin をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)

# 手順

## (1) ローカル環境のAWS CLIコンフィグ設定
ローカル環境にて「aws configure」コマンドを実行すると項目の入力を求められるため、事前準備(a)の情報をもとに入力し、AWS CLIコンフィグ設定を行う。

```markdown:aws-cliのconfigure設定
$ aws configure
AWS Access Key ID [None]: (自身のIAMユーザーの「アクセスキーID」を入力)
AWS Secret Access Key [None]: (自身のIAMユーザーの「シークレットアクセスキー」を入力)
Default region name [None]: (自身のリージョンを入力、東京だったら「ap-northeast-1」を入力)
Default output format [None]: json
```
- 「Default output format」はjson以外も選べるが、本記事ではjsonを選択
  - 【参考】Default output format

|フォーマット|説明|
|:--|:--|
|json|JSON形式で出力| 
|yaml|YAML形式で出力(AWS CLI ver.2から利用可能)|
|text|複数行のタブ区切り文字列値の形式で出力。grep、sed、awkなどで加工しやすい|
|table|セルの罫線を形成する文字列(+|-)を使用して表形式で出力。可読性は高いが、プログラム的には扱いづらい|

- コンフィグ設定が完了すると、コンフィグ設定が書き込まれた以下ファイルが作成される。(Mac環境で実施した場合の状態のため、Windows環境などの場合は適宜フォルダパスを読み替えてください。)

```markdown:aws-cliコンフィグファイル(Mac環境)
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
```
## (2) MFAを利用したAWS CLI経由でのAWSリソースアクセス認証
以下の情報を準備して、aws cliコマンドを実行してアクセス認証を行う。

- 事前準備(a)で控えた、ARN情報から「user」を「mfa」に置換した文字列
 - 本記事のssm-userの例) arn:aws:iam::123456789012:**mfa**/ssm-user
- MFA認証で使う6文字のコード

```markdown:本記事のユーザー(ssm-user)で実行で認証する場合
$ aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/ssm-user --token-code XXXXXX
{
    "Credentials": {
        “AccessKeyId”: "access-key-id",
        “SecretAccessKey”: "secret-access-key",
        “SessionToken”: "temporary-session-token",
        “Expiration”: "expiration-date-time"
    }
}
```

なお、認証情報の有効期限はデフォルトでは12時間となりますが、「--duration-seconds」オプションを使用することで、「900秒(15分)」から「129600秒(36時間)」まで変更可能です。ただし、rootユーザーの場合は「900秒(15分)」から「3600秒(1時間)」となります。

## (3) AWS CLIコマンドからssm経由でセッションスタート
事前準備(b)で用意したEC2インスタンスの「instance-id」をターゲットに設定し、ssmプラグインをaws cliから実行してセッションを開始する。

```markdown:
$ aws ssm start-session --target i-xxxxxxxxxxxxxxxxxxx --region ap-northeast-1

Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxx
sh-4.2$
```

# おまけ ： MFA認証情報を、AWS CLIのプロファイル情報として利用する
認証情報が有効な間に限りますが、「credentials」ファイルにMFA情報として追記することで、AWS CLIコマンドの実行の際に「--profile」オプションの引数としてMFA認証プロファイルを利用することが可能となります。

## [1] 手順(2)で取得した認証情報をcredentialsファイルに追記
ここで指定したプロファイル名(mfa)で、AWS CLIコマンドの引数として利用可能になる

```markdown:~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[mfa]
aws_access_key_id = "access-key-id"
aws_secret_access_key = "secret-access-key"
aws_session_token = "temporary-session-token"
```

## [2] 作成したプロファイル情報を指定してAWS CLIコマンドを実行
「--pforile」オプションで、[1]で作成したプロファイル名(mfa)を指定することで、実行可能となる。

```markdown:
$ aws ssm start-session --target i-xxxxxxxxxxxxxxxxxxx --region ap-northeast-1 --profile mfa

Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxx
sh-4.2$
```

# 参考URL
- [【AWS公式】AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
- [【AWS公式】(オプション) AWS CLI 用の Session Manager Plugin をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)
- [【AWS公式】MFA トークンを使用して、AWS CLI 経由で AWS リソースへのアクセスを認証する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/)
- [【AWS公式】get-session-token](https://docs.aws.amazon.com/cli/latest/reference/sts/get-session-token.html)
- [【AWS公式】セッションを開始する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html)