AWS Systems Manager のドキュメントを作って、使ってみた。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

福岡オフィスの梶原@AWS事業本部です。

EC2で良く同じコマンド打たないですか?
良くじゃなくても、1ヶ月前と同じコマンド打ちたいと思ったりして、あれ、なんだっけなと思ったりするお年ごろになってきました・・・

さて、そんなあなたにAWS Systems Manager のドキュメントです。

想定しているユースケースはこんなかんじです。

「あのコマンドEC2上で流しといてくれない?」
「え、どのコマンドでしたっけ?」
「あれあれ、1ヶ月前くらいにお願いしたやつ」
「どのインスタンスでしたっけ?」
「どれだっけ?、Webサーバ?かな?」
「こ、これかな。よろしくおねがいしまーす![Enter]」

という状況が
「あのコマンドEC2上で流しといてくれない?」
「このリンク開いて、ポチっポチっとボタン押してもらうと、S3に結果でるようにしたんすよー」
「おー、結果保存されてる」

となると嬉しいなと。思います。さて、サクサクいきます。

前提条件

Systems Manager の使用条件をクリアしている事
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-prereqs.html

参考情報

aws:runCommand
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html#automation-action-runcommand

手順

AWS Systems Manager ドキュメント作成

コンソールの検索窓で[sy Enter]
Systems Manager のAWSコンソールを表示 共有リソースのドキュメントを選択

ドキュメントの作成をクリック

AWS Systems Manager ドキュメント作成の詳細

ドキュメントを作成していきます。

名前:は好きな名前を付けてください
ドキュメントタイプ - オプション:はオートメーションドキュメントを選択
コンテンツ:はここではyamlを選択 (コンテンツ形式はjsonでも記述は可能です)

以下のyamlをコンテンツに入力します

---
description: "Automation Document runCommand"
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  InstanceId:
    type: "StringList"
    description: "(Required) InstanceIds to run command"
  S3BucketName:
    type: "String"
    description: "(Required) S3BucketName"
  S3KeyPrefix:
    type: "String"
    description: "(Required) S3KeyPrefix"
  AutomationAssumeRole:
    type: "String"
    description: "(Optional) The ARN of the role that allows Automation to perform\
      \ the actions on your behalf."
    default: ""
mainSteps:
- name: "ls"
  action: "aws:runCommand"
  inputs:
    DocumentName: "AWS-RunShellScript"
    InstanceIds: "{{ InstanceId }}"
    OutputS3BucketName: "{{ S3BucketName }}"
    OutputS3KeyPrefix: "{{ S3KeyPrefix }}"
    Parameters:
      commands:
      - "find ~/ -type f -print0 | xargs -0 ls -al"

commandsの部分に実行したいコマンドを記載します。
ここでは、findを使って、ホームフォルダ(~/)配下のファイルの詳細を一覧表示させています。複数コマンドを実行したい場合は - でリスト形式で続けて書くことができます。

find ~/ -type f -print0 | xargs -0 ls -al

今回は対象のインスタンス、また出力したいS3バケットをパラメータ化していますが、
対象を固定したい場合はパラメーターInstanceId, S3BucketName を使用せずに、{{ InstanceId }}, {{ S3BucketName }}"に直接記載しても問題ありませんので、ご自由にカスタマイズください
入力が完了しましたら、「ドキュメントの作成」をクリックして、作成します。

AWS Systems Manager ドキュメントの確認

ドキュメントが正常に作成されると一覧にもどりますので、詳細を表示をクリックして内容を確認します。万が一押し損ねた場合は、ドキュメントの一覧画面から作成したドキュメントを検索し押下しても同じ画面になります。

AWS Systems Manager ドキュメントの実行

詳細画面からオートメーションの実行を押下

入力パラメーターで、実行したいインスタンスIDを入力もしくはインタラクティブインスタンスピッカーの表示で実行したいインスタンスを表示させて選択してください S3バケット名、S3Prefix(実行日などいれるとわかりやすいかと)を入力し、さらに画面下部にある オートメーションの実行を押下の前に

AWS CLI コマンドと共有可能な実行リンクをクリックして、表示されるリンクを取得しておくと後で同じドキュメントを実行する際は一発で飛べます。

↓こんなやつ

https://ap-northeast-1.console.aws.amazon.com/systems-manager/automation/execute/devio-ssm-documnet-runcommand-ls?region=ap-northeast-1#

さて、気を取り直してオートメーションの実行を押下するとドキュメントのコマンドが、選択したインスタンスで実行され、進捗状況が表示されます。

実行したステップ のステップIDのリンクをクリックすると実行の詳細が表示されます。

また、実行結果はS3に保存するようにしてますので 指定した、S3に実行結果が出力されます。

チョット出力される階層が深いですがOutputオブジェクトにコマンドの出力内容が出力されています。

s3://bucket名/指定したプリフィクス/CommandId/InstanceId/awsrunShellScript/0.awsrunShellScript/output

まとめ

今回のような、ちょっとしたコマンド実行にドキュメントを使うのは若干大げさかとは思いますが、実際の運用では複数のコマンドや、複数インスタンスに対して実行することもあるかと思います。また簡単なドキュメントを1つ作っておくと、拡張しやすいのでカスタマイズしていくつかもっていると便利な気がしています。 また、依頼者と実行者が別、実行するタイミングが不明、履歴を残したい、コマンドにバグがあったら訂正も面倒、定期的に実行したいとかの場合もドキュメントとオートメーションは役に立つかと思います。
通常運用で良く使用するようなインスタンスの起動停止などはすでに沢山オートメーションドキュメントに登録されていますので運用を自動化したい方はぜひドキュメント、オートメーションを活用してみてください。

どなたかというか、何か月後の自分の役に立つと嬉しいです。