タケユー・ウェブ日報

Webシステム受託会社の業務の中での気づきや調べごとのメモ。

EC2インスタンスにSSH接続せずに任意のLinuxコマンドを実行する

AWS Systems Manager(通称 SSM)Run Commandを使うと、EC2インスタンスに対しての様々な管理タスクの実行を自動化したり、多くのインスタンスにたいして大規模に実行したりできます。

管理タスクはコマンドドキュメントという形で定型化されていて、このうちの AWS-RunShellScript を使うと、任意のLinuxコマンドを、外部から実行することができます。

設定

必要なの操作は、次の2つです。

  1. EC2インスタンスでSSMエージェントを起動
  2. EC2インスタンスに必要な権限を与える

EC2インスタンスでSSMエージェントを起動

AmazonLinux2であればデフォルトでインストールされているため、操作は不要です。 そうでない場合、SSMエージェントをインストールしておきます。

docs.aws.amazon.com

systemctl status amazon-ssm-agent で実行中のインスタンスがSSMへ接続できていることを確認します。

[ec2-user@ip-10-0-0-108 ~]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-08-12 13:57:27 UTC; 4s ago
 Main PID: 1536 (amazon-ssm-agen)
   CGroup: /system.slice/amazon-ssm-agent.service
           └─1536 /usr/bin/amazon-ssm-agent

Aug 12 13:57:29 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [MessageGatewayService] listening reply.
Aug 12 13:57:29 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [LongRunningPluginsManager] There are no long running plugins currently getting executed - skipp...healthcheck
Aug 12 13:57:29 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [StartupProcessor] Executing startup processor tasks
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [StartupProcessor] Write to serial port: Amazon SSM Agent v2.3.1319.0 is running
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [StartupProcessor] Write to serial port: OsProductName: Amazon Linux
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [StartupProcessor] Write to serial port: OsVersion: 2
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [MessageGatewayService] Opening websocket connection to: wss://ssmmessages.ap-northeast-1.amazon...tream=input
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [MessageGatewayService] Successfully opened websocket connection to: wss://ssmmessages.ap-northe...tream=input
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [MessageGatewayService] Starting receiving message from control channel
Aug 12 13:57:30 ip-10-0-0-108.ap-northeast-1.compute.internal amazon-ssm-agent[1536]: 2020-08-12 13:57:27 INFO [MessageGatewayService] [EngineProcessor] Initial processing
Hint: Some lines were ellipsized, use -l to show in full.
EC2インスタンスに必要な権限を与える

EC2インスタンスに対して RunCommand が使えるように、EC2に対して必要な権限を割り当てるために、インスタンスロールを作成します。 インスタンスロールには AmazonSSMManagedInstanceCore AWS管理ポリシーを適用します。

f:id:uzuki05:20200812221112p:plain
ロール作成

f:id:uzuki05:20200812221213p:plain
一般的なユースケース EC2インスタンス

f:id:uzuki05:20200812221935p:plain
AmazonSSMManagedInstanceCore

f:id:uzuki05:20200812222300p:plain
わかりやすい名前でロールを作成

f:id:uzuki05:20200812222840p:plain
インスタンスへのIAM ロールの割り当て

RunCommand を試す

f:id:uzuki05:20200812223206p:plain
AWS Systems Manager > RunCommand を選択

f:id:uzuki05:20200812223322p:plain
コマンドを実行する

f:id:uzuki05:20200812223834p:plain
AWS-RunShellScript を選択してコマンドのパラメータに実行したいコマンドを記入

f:id:uzuki05:20200812224225p:plain
実行対象のインスタンスを選択

f:id:uzuki05:20200812224442p:plain
今回は同時実行数 1 、出力オプションはなし

f:id:uzuki05:20200812230032p:plain
コマンドを送信

f:id:uzuki05:20200812230222p:plain
コマンド実行に成功しました