AWS Systems Manager を使用してEC2インスタンスでRun Commandを実行する

2021.03.12

こんにちは、yagiです。

本日は、「AWS Systems Manager を使用してEC2インスタンスでRun Commandを実行する」内容について記載します。

AWS Systems Managerとは?


Systems Managerは、AWSリソースに対して安全かつ大規模にアクションを実行できるようにする管理ツールです。

Systems Managerの自動化機能の1つであるRun Commandを使用すると、bastion host(要塞ホスト)、SSH、またはリモートPowerShellを使用する必要がなくなるため、管理タスクを簡素化できます。 (公式ドキュメントからの引用)

セキュリティ上SSHでのアクセスを許可したくない場合や、bastion hostを置かずに構成を簡素化したい場合など様々な運用上のユースケースにて利用できます。

設定してみる


Remotely Run Commands on an EC2 Instance

上記公式ドキュメントのチュートリアルにしたがって進めていきます。 今回は以下のステップで進めます。

>Step 1. IAM roleを作成する

>Step 2. EC2インスタンスを作成する

>Step 3. SystemsManagerエージェントをアップデートする

>Step 4. RunCommandを使用してシェルスクリプトを実行する

Step 1. IAM roleを作成する


EC2インスタンスでアクションを実行するための権限を Systems Manager に付与するためのIAM roleを作成します。

AWSコンソールでIAMコンソールに移動し、「ロール」の「ロールの作成」を押下します。

「AWS サービス」で「EC2」を選択し、「次のステップ: アクセス権限」を押下します。

「ポリシーのフィルタ」に「AmazonEC2RoleforSSM」を入力し、チェックボックスにチェックを入力します。「次のステップ: タグ」を押下します。

ロール名、ロールの説明を入力します。「ロールの作成」を押下します。

「ロール」にて「EnablesEC2ToAccessSystemsManagerRole」が作成されていることを確認します。

Step 2. EC2インスタンスを作成する

AWSコンソールでEC2コンソールに移動し、「インスタンスを起動」を押下します。

AMIの選択画面で、「Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。

「t2.micro」インスタンスタイプを選択し、「次のステップ: インスタンスの詳細の設定」を押下します。

インスタンスの詳細の設定画面で、Step 1で作成した「EnablesEC2ToAccessSystemsManagerRole」を選択します。それ以外は全てデフォルトのまま「確認と作成」を押下します。

「起動」を押下してキーペアの選択画面で、「キーペアなしで続行」を選択し、チェックボックスにチェックを入れます。 (今回、EC2インスタンスへのアクセスにSSHは使わないのでキーペアの作成は不要であるため)

「インスタンスの作成」を押下します。

以下のように作成されたことを確認します。

Step 3. SystemsManagerエージェントをアップデートする

Systems Manager エージェントを実行する EC2 インスタンスができたので、管理タスクを自動化し、インスタンスを管理できます。この手順では、ドキュメントと呼ばれる事前にパッケージ化されたコマンドを実行して、エージェントをアップグレードします。新しいインスタンスを作成するときに、System Manager エージェントを更新することをお勧めします。

AWS Systems Managerコンソールへ移動し、「Run Command」を押下します。

「コマンドを実行する」を押下します。

コマンドの実行画面で「AWS-UpdateSSMAgent」をフィルタして選択します。

ターゲットを選択します。「インスタンスを手動で選択する」を選択し、Step 2で起動したEC2インスタンスにチェックを入れます。「実行」を押下します。

コマンドが正常に送信されると以下の画面になります。

更新ボタンを押下して、ステータスが「成功」になればOKです。

Step 4. RunCommandを使用してシェルスクリプトを実行する

EC2 インスタンスに最新の Systems Manager Agent があるため、EC2 インスタンスのパッケージをアップグレードできます。この手順では、Run Command を介してシェルスクリプトを実行します。

コマンドの実行画面で「AWS-RunShellScript」をフィルタして選択します。

ターゲットを選択します。「インスタンスを手動で選択する」を選択し、Step 2で起動したEC2インスタンスにチェックを入れます。

コマンドのパラメータまでスクロールし、「sudo yum update -y」入力して、「実行」を押下します。

実行コマンドのステータスが「成功」に変わったら、「ターゲットと出力」でインスタンスを押下します。

以下よりコマンドの出力を確認できます。

結論


AWS Systems Manager を使用してEC2インスタンスでRun Commandを実行し、コマンドの出力を確認するまでを実施しました。 今回はEC2インスタンス1台での利用でしたが、ターゲットの選択で、タグやリソースグループを使って複数台のターゲットをまとめて選択すれば、一回に複数台の操作が可能となります。 セキュリティ上有用なだけではなく運用の手間や管理タスクを簡素化できるなど様々なユースケースで活用できます。

参考リンク


AWS Management Tools Blog Category: Amazon Systems Manager

追記


社内でアドバイスをいただきましたので追記します。 現在ではIAMポリシー「AmazonEC2RoleforSSM」を使用するのは非推奨となっており、代わりに「AmazonSSMManagedInstanceCore」を使用するのが現在のスタンダードになっているようです。

ポリシーの概要の説明欄にも、もうすぐ廃止されるため、「AmazonSSMManagedInstanceCore」を使用するよう推奨する内容の記載がありました。

なお、AWS Configを利用して、AmazonEC2RoleforSSM ポリシーをアタッチしたIAMロール「EnablesEC2ToAccessSystemsManagerRole」を非準拠として検出することができます。 検出されたIAMロールをクリックして、ポリシーの変更もスムーズにできました。

参考リンク いまのうちから AWS Systems Manager で利用している AmazonEC2RoleforSSM ポリシーを見直しましょう!