【AWS】Systems Manager 自作オートメーションドキュメント その1
はじめに
AWSのSystems Managerで、(以下SSM)
オートメーションドキュメントを自作したので、
やりたいこと別に紹介します!
前回導入編を書いたので、その続編的な何かです。
目次
■API使って操作したい
下記の例は、DBインスタンスのスナップショットを作成するAPI、
CreateDBSnapshot
を使って、
命名規則に則ったスナップショットを作成します。
description: Create DB snapshot schemaVersion: '0.3' parameters: DBInstanceId: type: String description: (Required) The identifier of the Amazon RDS DB instance. mainSteps: - name: CreateRDSSnapshot action: 'aws:executeAwsApi' inputs: Service: rds Api: CreateDBSnapshot DBInstanceIdentifier: '{{ DBInstanceId }}' DBSnapshotIdentifier: 'Ops-{{ global:DATE }}-{{ DBInstanceId }}'
parameters
のDBInstanceId
ではDB識別子を指定するイメージです。
ポイント
action:
に'aws:executeAwsApi'
を指定すれば、APIが使えるinputs:
のApi
に、使用するAPIを指定する- APIの引数を
inputs
に追加する- 今回の場合は、CreateDBSnapshotの
Request Parameters
を参考に指定 DBInstanceIdentifier
はパラメータのDBInstanceId
の値を、DBSnapshotIdentifier
は命名規則に沿って指定- APIの情報は、大体操作方法をググると出てくる
- 今回の場合は、CreateDBSnapshotの
- ちなみに
{{ global:DATE }}
は日付をとってくるシステム変数
■ステータスの変化を待ちたい
APIでCreateなんとか
を使ってなんか作ったとして、
その何かが指定した状態に変わるのを待つことができます。
下記の例は、■API使って操作したいで作成したスナップショットの状態が
available
になるのを待ちます。
# ヘッダは省略 - name: VarifyRDSSnapshot action: 'aws:waitForAwsResourceProperty' inputs: Service: rds Api: DescribeDBSnapshots PropertySelector: 'DBSnapshots[0].Status' DesiredValues: - available DBSnapshotIdentifier: 'Ops-{{ global:DATE }}-{{ DBInstanceId }}'
ポイント
action:
に'aws:waitForAwsResourceProperty'
を使用Api:
には状態をトレースしたい対象の表示(Describe)系APIを指定- 今回の場合は、DBスナップショットの状態が知りたいので、
DescribeDBSnapshots
を指定
- 今回の場合は、DBスナップショットの状態が知りたいので、
PropertySelector:
には、Apiで取得できるレスポンスから状態へのJSONパスを指定- 今回の場合は、DescribeDBSnapshotsのSample Responceを参考に指定
DesiredValues:
には、期待する状態を指定DBSnapshotIdentifier:
はDescribeDBSnapshots
に対する引数
■別のオートメーションドキュメントを呼び出したい
下記の例は、RDSのリードレプリカを作成するオートメーションドキュメントを
呼び出しています。
※呼び出し先ドキュメントは■API使って操作したいと■ステータスの変化を待ちたいの連結版だと思っていただければ。。
# ヘッダは省略 - name: CallCreateDBSnapshotAutomation action: 'aws:executeAutomation' inputs: DocumentName: CreateDBSnapshot RuntimeParameters: DBInstanceIdentifier: - '{{ DBInstanceId }}'
ポイント
action:
は、'aws:executeAutomation'
を指定inputs:
のDocumentName
は呼び出すオートメーションドキュメントを指定RuntimeParameters:
には指定するオートメーションドキュメントのパラメータを指定- 呼び出し先のオートメーションドキュメントの
parameters:
で定義しているパラメータ
- 呼び出し先のオートメーションドキュメントの
■コマンドを投入したい
方法はいくつかありますが、
オートメーションドキュメントで実行する方法を紹介します。
下記の例は、
対象のEC2インスタンス(Linux)に対して、cat /etc/hosts
を実行します。
出力結果は、オートメーションの実行履歴から確認できます。
description: exec command schemaVersion: '0.3' parameters: InstanceId: type: String mainSteps: - name: CatHostsFile action: 'aws:runCommand' inputs: DocumentName: AWS-RunShellScript InstanceIds: - '{{ InstanceId }}' Parameters: commands: - cat /etc/hosts
実体は、AWS-RunShellScript
というコマンドドキュメントを
外部から呼び出しているだけです。
ただコマンド実行したいだけなら、
AWS-RunShellScript
を実行すればよいと思います。
(書いてて気づいた)
ただ、オートメーションドキュメントに組み込みたいんじゃ!っていう場合は、
この書き方で実現できます。
私は、aws:branch
で分岐させた先で使いました。
※分岐させる書き方は次回書きます。
ポイント
action:
はコマンドドキュメントを呼び出す'aws:runCommand'
を指定- コマンドドキュメントは
AWS-RunShellScript
を指定 - InstanceIdsには対象のEC2インスタンスを指定
Parameters:
のcommands:
に投入したいコマンドを記述
■眠りたい
オートメーションドキュメントでは下記のように眠ります。
時間はISO 8601の書式で記述します。
タイムスタンプでの指定も可能です。
# ヘッダは省略 - name: Sleep action: 'aws:sleep' inputs: Duration: PT5S
ポイント
- 時間はISO 8601の書式で記述
- タイムスタンプでの指定も可能(Duration→Timestampにする)
おわりに
AWSコンソールからポチポチやっていることや、
EC2インスタンスにログインしてコマンドたたくなど、
それらを並べてフローにできるので、
なかなか便利です。
参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html