ぴよ丸水産

週末ファゴッティストによる技術ブログ

【AWS】Systems Manager 自作オートメーションドキュメント その1

はじめに

AWSのSystems Managerで、(以下SSM)
オートメーションドキュメントを自作したので、
やりたいこと別に紹介します!

前回導入編を書いたので、その続編的な何かです。

blue-38.hatenablog.com

目次

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 }}'

parametersDBInstanceIdではDB識別子を指定するイメージです。

ポイント

  • action:'aws:executeAwsApi'を指定すれば、APIが使える
  • inputs:Apiに、使用するAPIを指定する
  • APIの引数をinputsに追加する
    • 今回の場合は、CreateDBSnapshotRequest Parametersを参考に指定
    • DBInstanceIdentifierはパラメータのDBInstanceIdの値を、DBSnapshotIdentifier命名規則に沿って指定
    • APIの情報は、大体操作方法をググると出てくる
  • ちなみに{{ global:DATE }}は日付をとってくるシステム変数

■ステータスの変化を待ちたい

APICreateなんとかを使ってなんか作ったとして、
その何かが指定した状態に変わるのを待つことができます。
下記の例は、■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を指定
  • PropertySelector:には、Apiで取得できるレスポンスから状態へのJSONパスを指定
  • 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