AWS Systems Manager Run Commandを利用したEC2インスタンスの管理とコマンド実行ガイド

## はじめに
SSM（AWS Systems Manager）Run Commandは、AWS環境内でリモート操作を可能にする強力なツールです。

主にEC2インスタンスやオンプレミスサーバーに対してコマンドを実行したり、ファイル転送やパッチ適用などの運用タスクを自動化するために利用されます。

本記事では、SSM Run Commandを使った技術検証の具体的な手順について解説します。

## 前提条件
:::note
**IAM Roleの設定:** 
最新のAmazon LinuxやWindows Serverにはプリインストールされていますが、手動でのインストールが必要な場合もあります。
```
AmazonSSMManagedInstanceCore
AmazonEC2RoleforSSM（古い場合）
```

**SSMエージェントのインストール:** 
最新のAmazon LinuxやWindows Serverにはプリインストールされていますが、手動でのインストールが必要な場合もあります。

**AWS CLIのセットアップ:** 
コマンドを実行するマシンにAWS CLIがインストールされ、適切に設定されていることを確認してください。
:::

## 検証内容

今回の検証では、SSM（AWS Systems Manager）Run Commandを使用し、マネジメントコンソール上からEC2インスタンスに対してコマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/071ece49-3dc5-dd7d-c659-a24f44a875e2.png)
引用画像：https://image.itmedia.co.jp/l/im/ait/articles/2205/19/l_news010_01.png

### EC2インスタンスの準備

SSMを利用するEC2インスタンスを作成し、前述のIAMロールをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/861dd96e-902b-9f73-7425-195e4944f4cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5785d926-157a-fcaf-da19-339ad7f2dce8.png)


一般的にはAmazon Linux 2を使用しますが、WindowsやUbuntuなども対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4a2ebaad-ec9a-cfe1-093c-a7826e5363f9.png)


インターネットアクセスを持つか、VPCエンドポイントを設定して、SSMをプライベート環境で利用可能にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c6e0da17-1dc0-63aa-873d-45d80c4ffe12.png)


### SSM Run Commandの実行
**AWS Management Consoleを使用する場合の手順:**

AWSコンソールにログインし、Systems Managerを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7d058e5b-785d-b87a-83df-761ff94d55d1.png)


Run Commandを選択し、「Run command（コマンドを実行する）」をクリックします。次に、DocumentからAWS-RunShellScriptを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/160ce7e5-db59-b02a-0eb5-1ac4b68f59d6.png)

実行対象のEC2インスタンスを選び、コマンド（例：echo "Hello, World"）を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4598ea44-c9e1-ab89-3f36-c0cff86d65b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/13172ee6-111d-eda3-38fc-f6b85a76f1c3.png)


「Run」をクリックし、実行後の結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/857f9b5b-5fa2-f99f-83eb-998a23c808ca.png)

**AWS CLIを使用する場合:**

```bash
aws ssm send-command \
  --document-name "AWS-RunShellScript" \
  --targets "Key=instanceIds,Values=i-xxx" \
  --parameters 'commands=["echo Hello, World"]' \
  --comment "Test command using SSM Run Command"
```

### 結果の確認

SSM Run Commandの画面やAWS CLIを使用して、コマンドの実行結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a05052e9-0356-9987-33d6-38b81be4c185.png)


```bash
aws ssm list-command-invocations --command-id "command-id-here" --details
```

実行結果のStatusがSuccessであることを確認し、出力が期待通りかどうかをチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cbc5f13c-6237-362c-e852-69234a72d1b2.png)


### 追加の検証: 実務向けのファイル操作など

より実務的な操作として、テストファイルを作成し、それを別のディレクトリにコピーする操作に変更するコマンドを試します。

**コマンド例:**

```bash
echo \"This is a test file\" > /tmp/testfile.txt
mkdir -p /tmp/testdir
cp /tmp/testfile.txt /tmp/testdir/
ls -l /tmp/testdir
```

AWS Systems Manager (SSM)を使って、指定されたEC2インスタンスに対してテストファイルを作成し、ディレクトリ操作とファイルコピーを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/597d7007-0d68-79a3-5ad5-f2cd8f689b65.png)

```bash
**実際のコマンド結果**
[ec2-user@ip-10-0-0-93 ~]$ cd /tmp/
[ec2-user@ip-10-0-0-93 tmp]$ ls -l
total 4
drwx------ 3 root root 17 Oct 11 23:53 systemd-private-e7bedf712f9e4eb390bab49acfc1e208-chronyd.service-hq11vv
drwxr-xr-x 2 root root 26 Oct 12 00:17 testdir
-rw-r--r-- 1 root root 22 Oct 12 00:17 testfile.txt
[ec2-user@ip-10-0-0-93 tmp]$ cat testfile.txt 
"This is a test file"
[ec2-user@ip-10-0-0-93 tmp]$
```



### エラーハンドリングの確認

意図的にエラーを発生させ、エラーメッセージやログを確認する方法を検証します。

**例: 存在しないディレクトリに移動するコマンドを実行します。**
```bash
cd /nonexistent_directory
```

正常にエラーが発生していることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6ae0213d-dac5-3fd3-825a-96b130a99921.png)


## 補足事項
:::note warn
**SSMエージェントの接続状況:**
Managed Instancesに正常に表示されているか確認します。

**実行結果のログ確認:** 
CloudWatch Logsを有効にしていれば、標準出力やエラー出力をログから確認できます。

**コスト管理:** 
SSMの利用には料金が発生するため、大量のインスタンスや頻繁な実行がある場合には注意が必要です。
:::

## まとめ
SSM Run Commandを利用することで、AWS上での運用タスクを効率的にリモートで管理・自動化できます。

本検証手順を通じて、基本的なコマンド実行からアプリケーション操作、エラーハンドリングまでを網羅的に確認し、SSMの運用に耐えうる環境構築の指針としてご活用ください。

## おまけ：Ansibleとの違いについて

AWS Systems Manager Run CommandとAnsibleが少し似ているなぁと思ったので、違いについて深堀して調べてみました。

### 違い①：アーキテクチャ
SSMはAWSに統合されており、エージェントを使用してAWS環境内でコマンドを実行します。一方、Ansibleはエージェントレスで、SSHを通じてリモートサーバーに接続します。

### 違い②：機能の範囲
Ansibleは構成管理やデプロイメントを含む広範なオーケストレーション機能を提供しますが、SSM Run Commandは主にAWSインスタンスのリモートコマンド実行に特化しています。

### 違い③：マルチクラウド対応
AnsibleはAWSだけでなく、他のクラウドサービスやオンプレミス環境にも対応可能です。対照的に、SSMはAWS環境に特化しており、AWSの他のサービスとの連携が強化されています。

:::note
これらの違いを考慮することで、具体的なニーズに応じて適切なツールを選択できます。
:::


## 参考文献

https://dev.classmethod.jp/articles/aws-systems-manager-run-command-ec2-instance/