EC2 ImageBuilder実行時に呼び出しされるSSM Automationドキュメントをのぞいてみた
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の設定すべてがマッピングできたわけではありませんが、概ね動作を掴むことができました。
本文で触れていませんが、今回のようにテストコンポーネントを指定していない場合でも、テスト(ビルドフェーズで作成されたイメージに対してのテスト)が動作していることが気になりました。