EC2 ImageBuilder実行時に呼び出しされるSSM Automationドキュメントをのぞいてみた

EC2 ImageBuilderでビルドを実行すると、SSM Automationが実行されます。この際に利用されるAutomation ドキュメント「ImageBuilderBuildImageDocument」の定義を確認してみました。
2020.01.16

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

EC2 ImageBuilderでビルドを実行すると、SSM Automationが実行されます。 この際に利用されるAutomation ドキュメント定義を確認しましたのでアウトプットしておきます。

はじめに

EC2 ImageBuilderは、AWS Systems Manager(SSM)などの他のAWSサービスを使用してイメージを作成します。

ビルド(イメージパイプラインの実行)を行うと、StartAutomationExecution(SSM Automationドキュメント実行)が呼び出されていることがCloudTrailからも確認ができます。

この際に呼び出しされているAutomation ドキュメントはImageBuilderBuildImageDocumentです。

該当ドキュメントを確認すると40のステップで構成されており、入力パラメータ(EC2 ImageBuilderの設定)により実行されるステップが変化する定義になっていました。

本エントリは、イメージパイプラインが以下設定時の動作となります。

Configuration

Image recipe

該当のイメージパイプラインを実行し、正常終了している状態から呼び出しされたSSM Automationを確認しました。

ImageBuilderBuildImageDocument

ステップ 1: CreateLaunchTemplateBranch

aws:branchアクションが使用され、イメージパイプラインの設定にあるキーペアの値を判定し、後続ステップが選択されています。今回の設定ではキーペア(test)を指定していたので、後続処理がCreateLaunchTemplateとなりました。

ステップ 2: CreateLaunchTemplate

aws:executeAwsApiアクションが使用され、CreateLaunchTemplateAPIが呼び出しされています。ここで、起動テンプレートが作成されています。

ステップ 3: EndOfCreateLaunchTemplateBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 4: CreateAutoScalingGroupBranch

aws:branchアクションが使用され、イメージパイプラインの設定にあるキーペアの値を判定し、後続ステップが選択されています。今回の設定では、キーペア(test)を指定していたので、後続処理がCreateAutoScalingGroupとなりました。

ステップ 5: CreateAutoScalingGroup

aws:executeAwsApiアクションが使用され、CreateAutoScalingGroup APIが呼び出しされています。ここで、Auto Scalingグループが作成されています。

ステップ 6: EndOfCreateAutoScalingGroupBranch

aws:sleepアクションが使用され、180秒間待機する設定となっていました。

ステップ 7: SuspendAutoScalingProcesses

aws:executeAwsApiアクションが使用され、SuspendProcesses APIが呼び出しされています。Auto Scalingプロセス(AZRebalance, AddToLoadBalancer, AlarmNotification, HealthCheck, Launch, RemoveFromLoadBalancerLowPriority, ReplaceUnhealthy, ScheduledActions, Terminate)を一時停止しています。

ステップ 8: GetBuildInstanceId

aws:executeAwsApiアクションが使用され、DescribeAutoScalingGroups APIが呼び出しされています。Auto Scalingグループにより起動されたインスタンスIDを取得していました。

ステップ 9: WaitForInstanceToSpinUp

aws:waitForAwsResourcePropertyアクションで、DescribeInstanceStatus APIが呼び出しされ、EC2のステータスチェックの合格をもって本ステップが実行されます。

ステップ 10: RunBuildScriptsBranch

aws:branchアクションが使用され、イメージパイプラインの設定にあるS3へのログ出力値を判定し、後続ステップが選択されています。今回の設定では、ログ出力バケット(image-builder-logs-20200111)を指定していたので、後続処理がRunBuildScriptsWithLoggingとなりました。

ステップ 11: RunBuildScriptsWithLogging

aws:runCommandアクションが使用され、EC2 ImageBuilderのコンポーネントオブジェクトが実行されています。

ステップ 12: EndOfRunBuildScriptsBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 13: RunSysprepGeneralizeBranch

aws:branchアクションが使用され、Run Commandドキュメント値を判定し、後続ステップが選択されています。ここでは、Run Commandドキュメントの値にAWS-RunShellScriptが指定されていたので、後続処理がEndOfRunSysprepGeneralizeBranchとなりました。

ステップ 14: EndOfRunSysprepGeneralizeBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 15: RunSanitizeScriptBranch

aws:branchアクションが使用され、イメージパイプラインの設定で指定したS3へのログ出力値を判定し、後続ステップが選択されています。今回の設定では、ログ出力バケット(image-builder-logs-20200111)を指定していたので、後続処理がRunSanitizeScriptWithLoggingとなりました。

ステップ 16: RunSanitizeScriptWithLogging

aws:runCommandアクションが使用され、S3バケットへロギングを行い、起動されたEC2のサニタイジングをしています。

ステップ 17: RunSanitizeScriptWithoutLogging

aws:runCommandアクションが使用され、S3バケットへロギングは行わず、起動されたEC2のサニタイジングをしています。

ステップ 18: EndOfRunSanitizeScriptBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 19: StopInstance

aws:changeInstanceStateアクションが使用され、Auto Scalingグループにより起動されたEC2を停止しています。

ステップ 20: CreateImage

aws:createImageアクションが使用され、停止したEC2よりAMIを作成します。

ステップ 21: CreateImageTags

aws:createTags アクションが使用され、イメージパイプラインの設定で指定したタグがAMIに付与されます。

ステップ 22: CleanupBranch

aws:branchアクションが使用され、cleanUpResources変数の値を判定し、後続ステップが選択されています。ここでは、trueが指定されていたので、後続処理がVerifyImageBranchとなりました。

ステップ 23: VerifyImageBranch

aws:branchアクションが使用され、 isBuildWorkflow変数の値を判定し、後続ステップが選択されています。ここでは、trueが指定されていたので、後続処理がVerifyImageとなりました。

ステップ 24: VerifyImage

aws:assertAwsResourcePropertyアクションが使用され、作成したAMIが利用可能になるま待機します。

ステップ 25: EndOfVerifyImageBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 26: TerminateInstanceOnSuccess

aws:changeInstanceStateアクションが使用され、作成したEC2を削除します。

ステップ 27: DetachInstanceFromAutoScalingGroup

aws:executeAwsApiアクションが使用され、DetachInstances APIが呼び出しされています。Auto Scalingグループから作成したEC2をデタッチします。

ステップ 28: DeleteAutoScalingGroup

aws:executeAwsApiアクションが使用され、DeleteAutoScalingGroup APIが呼び出しされています。Auto Scalingグループを削除します。

ステップ 29: DeleteLaunchTemplateBranch

aws:branchアクションが使用され、イメージパイプラインの設定にあるキーペアの値を判定し、後続ステップが選択されています。今回の設定では、キーペア(test)を指定していたので、後続処理がDeleteLaunchTemplateとなりました。

ステップ 30: DeleteLaunchTemplate

aws:executeAwsApi アクションが使用され、DeleteLaunchTemplate APIが呼び出しされています。起動テンプレートを削除します。

ステップ 31: EndOfDeleteLaunchTemplateBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

ステップ 32: EndOfCleanupBranch

aws:sleepアクションが使用され、5秒間待機する設定となっていました。

今回の設定で呼び出しされたステップは以上となります。

さいごに

EC2 ImageBuilderで呼び出しされる、SSM Automationドキュメントの一部をご紹介しました。 実行されたAutomation ドキュメントの入力パラメータと、EC2 ImageBuilderの設定すべてがマッピングできたわけではありませんが、概ね動作を掴むことができました。

本文で触れていませんが、今回のようにテストコンポーネントを指定していない場合でも、テスト(ビルドフェーズで作成されたイメージに対してのテスト)が動作していることが気になりました。

参考