AWS Systems Manager で時間のかかるAMI取得を待たずに次のステップに移行する


経緯など

最近はSystems Managerをこねこねしてます。
メンテナンスウィンドウを利用して、①AMIを取得(AWS-CreateImage のドキュメントを利用) → ②SSMAgentを更新 という一連のタスクの処理を設定していました。
しかし、EBSの容量が大きかったり、長い間AMIを取得していなかったりするとAMI取得にかなりの時間がかかる場合がありました。
インスタンスによってどのくらい時間がかかるのか分からないので、AMIの取得リクエストをしたら次のステップに移行したいという要望がありました。

AWSに問い合わせた

AWSに問い合わせると「AWS-CreateImage の代わりにカスタムドキュメントを作成するときにaws:executeAwsApi を利用することでAMIの作成完了を待たずに結果を返すよ」という旨の返答をいただきました。

aws:executeAwsApi を利用してAMIを作成するドキュメントを作成する

ドキュメント作成時にaws:executeAwsApi を利用するとAWS APIを呼び出して実行することができます。
実際にAMIを作成するドキュメントを作成するにはAWSコンソールの Systems Manager > ドキュメント で「オートメーションを作成する」から作成することができます。

オートメーション作成の画面にてエディタのタブから編集を選び、以下のyamlをエディタにコピペすれば作成することができます。

description: ''
schemaVersion: '0.3'
outputs:
  - create_ami.ImageId
parameters:
  InstanceId:
    type: String
  NoReboot:
    type: Boolean
mainSteps:
  - name: create_ami
    action: 'aws:executeAwsApi'
    inputs:
      Service: ec2
      Api: CreateImage
      InstanceId: '{{ InstanceId }}'
      Name: '{{ InstanceId }}_{{automation:EXECUTION_ID}}'
      NoReboot: '{{ NoReboot }}'
    outputs:
      - Name: ImageId
        Selector: $.ImageId

このyamlではinputにインスタンスIDと再起動のフラグを入力できるようにできますが、AWS APIのドキュメントを参考にもっと細かく制御することもできます。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.create_image
オートメーション単体で実行すると、実行はすぐに終わり、AMIのステータスはPendingで作成中ということが分かります。
(対象のインスタンスに大きめのディスクを付けてダミーのデータを積んでから確認したほうが分かりやすいですが、ここでは割愛します。)



まとめ

aws:executeAwsApi を利用してAMIを取得するドキュメントの作成方法を紹介しました。
今回はAMIを取得の際にaws:executeAwsApi を利用しましたが、もしかしたら他にも結果を待たずに次のステップに移行することができる処理があるかもしれません。
今後も実行が終了するまで待つべきタスク・スキップしてもよいタスクを見極めて実装していけたらと思います。