AWS CLIを使用してEC2にSSHやSCPでアクセスする

#目的

AWS CLIとSession Manager pluginをインストールして、プライベートサブネットのEC2にSSHで接続したり、SCPでEC2-ローカル間でファイル転送ができるようにします。

#環境

- Windows 10 Pro 64bit メモリ 32GB

#前提条件

- SSHアクセスが可能なユーザーをEC2に追加済みであること

ユーザーの追加方法は、下記のAWSサポートから参照できます。

- [SSH アクセスを行える新しいユーザーアカウントを Amazon EC2 Linux インスタンスに追加するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/new-user-accounts-linux-instance/)



#1. AWS CLI をインストールする

下記のAWSドキュメントから、AWS CLIのインストーラーをダウンロードして実行します。

- [Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html)

インストールが完了したら、コマンドプロンプトからAWS CLIのバージョンを表示してみます。

```
[win] $ aws --version 
aws-cli/2.1.22 Python/3.7.9 Windows/10 exe/AMD64 prompt/off
```

上記のようにバージョンが表示されれば、インストール成功です！

#2. Session Manager plugin をインストールする

下記のAWSドキュメントから、Session Manager pluginのインストーラーをダウンロードして実行します。

- [Windows に Session Manager plugin をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-windows)

Session Manager plugin が正常にインストールされたことを確認するには、次のコマンドを実行します。

```
[win] $ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
```

上記のように表示されれば、インストール成功です！

バージョンも確認してみます。

```
[win] $ session-manager-plugin --version
1.2.30.0
```

無事に表示できました！


#3. SSH 設定ファイルを更新する

SSH設定ファイルを更新して、Session Managerを通してのSSH接続を有効にします。

C:\Users\username\\.ssh\config に下記の文言を追加します。

```
# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

この作業に関するAWSドキュメントは下記URLより参照できます。

- [ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html)


.sshディレクトリやconfigファイルがない場合は作成してください。

```
[win] $ cd C:\Users\username
[win] $ mkdir .ssh
[win] $ cd .ssh
[win] $ type config > config
```

#4. aws configure を設定する

aws configureコマンドを実行して、AWS Access Key ID、AWS Secret Access Key、Default region name、Default output formatを入力します。

```
[win] $ aws configure
AWS Access Key ID [None]: XXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

AWS Access Key ID: IAMユーザーのアクセスキーIDを入力します。
AWS Secret Access Key: IAMユーザーシークレットアクセスキーを入力します。
Default region name: デフォルトでリクエストを送信するサーバーのAWSリージョンを特定します。
Default output format: 結果の出力形式を指定します。

アクセスキーIDとシークレットアクセスキーがない場合は、下記のAWSドキュメントを参考に作成してください。

- [アクセスキー ID とシークレットアクセスキー](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds)

これで、SSHやSCPを実行する準備が整いました！

この作業に関するAWSドキュメントは下記URLより参照できます。

- [設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)
- [設定の基本](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html)

#5. EC2インスタンスにSSHでログインする

以下のコマンドで、EC2にSSHでログインしてみます。

```
[win] $ ssh -i ~\path\key.pem username@i-xxxxxxxxxx

Enter passphrase for key '~\path\key.pem':
Last login: Tue Feb  9 14:59:54 2021 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```

無事にログインできました！

#6. SCPでファイル転送する

以下のコマンドで、EC2のユーザーディレクトリをデスクトップに転送します。

```
scp -i ~\path\key.pem -r username@i-xxxxxxxxxx:/home/username C:\Users\username\Desktop

Enter passphrase for key '~\path\key.pem':
hoge.txt                                       100%   18     0.7KB/s   00:00
```

無事にファイル転送できました！

#おわりに

間違っている点やもっと良い方法などありましたら、ご指摘いただけるとありがたいです！
最後までお読みいただきありがとうございました！

#参考にした記事

- [AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました](https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/)
- [scpコマンドでサーバー上のファイルorディレクトリをローカルに落としてくる](https://qiita.com/katsukii/items/225cd3de6d3d06a9abcb)