AWS: SystemsManagerのRunCommandでEC2インスタンスのコマンドを実行する

# AWS SystemsManagerとは？
SSM(SystemsManager)でできることはかなり沢山あるみたいです。
オンプレミスのサーバーも管理できるみたいですが、今回はEC2でのみの使用となります。

> AWS Systems Manager は、AWS アプリケーションおよびリソースのオペレーションハブであり、ハイブリッドおよびマルチクラウド環境向けのセキュアなエンドツーエンドの管理ソリューションです。これにより、安全でセキュアなオペレーションを大規模に実現できます。(AWS公式から引用)

## SSM RunCommandとは？
「AWS マネージドコンソールから各種コマンドを実行できる」機能です。
SSH等で対象サーバー内に入ることなく、マネージドコンソール上から各種コマンドが打てるようになります。

### RunCommandを実行するための前提条件
SSM RunCommandを実行するためにはいくつかの前提条件をクリアする必要があります。*EC2の場合
- インターネットアクセス(アウトバウンド)
- 対象EC2でSSM Agentがインストールされている
- 対象EC2でSystemsManagerがアクションを実行できるようにアクセスを許可

詳しくは以下公式ドキュメントを参照してください。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html

## SSM Agentとは？
AWS Systems Manager エージェント (SSM Agent) は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、エッジデバイス、オンプレミスサーバー、仮想マシン (VM) で実行される Amazon のソフトウェアです。

**SSM Agent を使用すると、SystemsManager でこれらのリソースを更新、管理、設定できるようになります。**

この**SSM Agentを対象のEC2で実行させることでSystemsManagerからEC2の操作が可能**になります。

# SystemsManager RunCommandを実装する
## ステップ1. IAMロールを作成する
対象のEC2インスタンスでSystemsManagerがアクションを実行するための権限をSystemsManagerに付与するためのIAMロールを作成していきます。

1. **AWSコンソール「IAM」からロールを作成を選択**
![スクリーンショット_2023-09-26_23_16_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/922bb949-5faf-43fd-9290-1ec143cd1c1d.png)

2. **エンティティタイプ・ユースケースを選択する**
エンティティタイプは「AWSのサービス」
ユースケースは「EC2」です。
![スクリーンショット_2023-09-26_23_17_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/56e3a7c1-ddda-8610-35e4-40cde2d09cfe.png)

3. **ポリシーを選択する**
AWS管理ポリシー: 「AmazonSSMManagedInstanceCore」を選択し、次へ。
![スクリーンショット_2023-09-26_23_17_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/d26f373e-6b99-16c9-1ba1-da96d05190ac.png)

4. **ロール名を命名する**
適切なロール名を命名してロールを作成します。
![スクリーンショット_2023-09-26_23_18_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/112e910e-2317-c059-4430-3e1b524bb809.png)


## ステップ2. EC２インスタンスにIAMロールをアタッチする
### EC2インスタンスを起動する場合
1. **AWSコンソール「EC2」でインスタンスを起動を選択する**
![スクリーンショット_2023-09-26_23_19_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/082ffb7f-b5e7-a62e-8862-d8fa323b7dbb.png)

2. **アタッチするIAMロールを選択する**
EC2の設定画面　**「高度な詳細」**の**「IAMインスタンスプロフィール」** にて、**先ほど作成したIAMロール「EnableEC2ToAccessSystemsManagerRole」を選択**します。
![スクリーンショット_2023-09-26_23_20_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/3c0b20c5-5d4b-2011-56c0-cdba19feafb1.png)

EC2の起動に成功すると **「実行中」** になります。
![スクリーンショット_2023-09-26_23_35_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/377801e7-18d4-c13d-7161-bdd7c23b423b.png)


### 起動中のEC2インスタンスにアタッチする場合
対象のEC2インスタンスを選択
↓
「アクション」
↓
「セキュリティ」
↓
「IAMロールを変更」と進みます
![スクリーンショット_2023-09-26_23_41_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/3f608b3b-e5a4-bb3b-2c0f-893ac535142b.png)

**先ほど作成したIAMロール「EnableEC2ToAccessSystemsManagerRole」を選択**し、IAMロールの更新を選択。
![スクリーンショット_2023-09-26_23_41_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/26e492a6-c592-69ea-7936-e927bf379ba8.png)

## ステップ3. 対象のEC2にSSM Agentをインストールする
AmazonLinux2以降であれば標準でインストールされています。
インストールされていない場合は以下公式ドキュメントに沿ってインストールします。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html

## ステップ4. SSM Agentをアップグレードする
EC2で実行されているSSM Agentを最新にアップグレードします。

AWSコンソール「SystemsManager」画面左の「Run Command」を選択します。
![スクリーンショット_2023-09-26_23_49_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/86126a10-7b28-5b15-1641-0b1883d9b61c.png)

遷移後の画面で「コマンドを実行する」を選択
![スクリーンショット_2023-09-26_23_49_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/adb4dd78-b416-74a9-526d-b767c7e175f6.png)

コマンドドキュメントで「AWS-UpdateSSMAgent」を選択。
![スクリーンショット_2023-09-26_23_49_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/580fea10-1b74-2920-d755-f16c86a7c94a.png)

ターゲットで対象のEC2インスタンスを選択します。

:::note warn
注意
[ステップ2. EC２インスタンスにIAMロールをアタッチする](#ステップ2EC２インスタンスにIAMロールをアタッチする)
or 
[ステップ3. 対象のEC2にSSM Agentをインストールする](#ステップ3対象のEC2にSSMAgentをインストールする)

どちらかの設定がうまくいっていないとこの画面でEC2インスタンスが表示されません。
:::
![スクリーンショット_2023-09-26_23_50_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/b8dd4087-ca11-3705-b869-024880ce8ba0.png)

画面をスクロールし「実行」を選択
![スクリーンショット_2023-09-26_23_50_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/44040040-631c-5728-ff2a-1b656011fbb0.png)

実行後ステータスが「成功」になっていれば成功です。
![スクリーンショット_2023-09-26_23_51_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/dfe41775-f6d7-4cf3-9218-6226a408de32.png)


## ステップ5. RunCommandを使用してシェルスクリプトを実行する
1. **SystemsManagerコンソールのRunCommandを選択する**
![スクリーンショット_2023-09-30_11_40_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/5b24bbb1-0ac0-5ada-3976-7341ea2b9890.png)

2. **コマンドドキュメント「AWS-RunShellScript」を選択する**
![スクリーンショット_2023-09-30_11_40_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/8ca2fe65-8f9a-28fa-e688-09244f3319fb.png)

3. **実行したいコマンドを入力する**
![スクリーンショット_2023-09-30_11_42_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/e9aeb0c5-4616-9567-42a9-5981fb9440d4.png)

4. **実行対象EC2インスタンスを選択する**
![スクリーンショット_2023-09-30_11_42_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/529894f9-3357-c7aa-6792-0dabc23f4b94.png)

5. **コマンドを実行する**
![スクリーンショット_2023-09-30_11_42_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/5c88a6d9-80dd-8890-7968-3d2bb21c69ea.png)

実行ステータスが成功になっていればOKです！
![スクリーンショット_2023-09-30_11_43_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/a4942b77-8f52-65b1-7a69-8e358d0a28d8.png)

## ステップ6．　RunCommandが正常に動いているかを確認する
[ステップ5. RunCommandを使用してシェルスクリプトを実行する](#ステップ5RunCommandを使用してシェルスクリプトを実行する)で実行したコマンドが正しく動作しているかを確認していきます。

以下ファイルが作成されていることを確認できました！
```
/var/log/ps_aux.log
```
![スクリーンショット 2023-09-30 11.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/f48515f4-bfeb-872e-b851-a5b6fafe1e06.png)


# 最後に
AWSはAWS内での普遍的な知識が結構あるので一つ覚えるとAWS内の他のサービスに応用できるのが良いところですねえ。
何でも出来すぎて怖いです。。
ではまたっ！

# 参考
https://dev.classmethod.jp/articles/aws-systems-manager-run-command-ec2-instance/#toc-5

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-ssm-agent.html