😶

[CFn]Image builder::DistributionConfigurationの構文エラーへの対処

2023/05/29に公開

本記事について

こんにちわ。

DevelopersIO BASECAMP一期の加藤です!

今回の記事はエラー文から検索して辿り着いた方以外には、面白味がなさそうな内容です。(開いてくださった方すみません。)

内容の要約

EC2Image Builderに挑戦。

・スタック実行時 エラーに遭遇した為、同じ事に遭遇する方がいるかもと思い文字にしました。

というものです。

結論

Type:AWS::ImageBuilder::DistributionConfiguration:Properties:Distributions:AmiDistributionConfigurationはドキュメントには「必須:いいえ」と書いてあるが、設定しないとCreate Failedします。


EC2Image Builderとは..

ユーザーガイドより

EC2 Image Builder は、カスタマイズされた安全な最新のサーバー イメージの作成、管理、デプロイメントを自動化するのに役立つフルマネージドの AWS サービスです。


マネジメントコンソールでパイプライン作成を試してみる

先にコンソールで試した後に、テンプレートで同環境を作成します。

畳んでいます。

「イメージパイプラインを作成する」をクリック。


パイプライン名を入力。(「拡張メタデータ収集を有効にする」はチェックをいれたままにします。)


ビルドスケジュールを選択します。※今回は「手動」を選択しました。


「次へ」をクリック。


「レシピを選択する」で「新しいレシピを作成する」+「Amazon マシンイメージ (AMI)」を選択。


レシピ名とバージョンを入力。


「ベースイメージ」は今回以下のように選択しました。


「インスタンスの設定」「作業ディレクトリ」はデフォルトのまま次へ進めます。


画像を拡大しても文字を読み取れないかもしれませんが、
「ビルドコンポーネント」(ここでは「aws-cli-version-2-linux」)


「テストコンポーネント」を選択しています。(「inspector-test-linux」などいくつか選択してみました。)


「ストレージ (ボリューム)」と「タグ」はデフォルトのまま「次へ」をクリック。


「サービスデフォルトを使用してインフラストラクチャ設定を作成する」のまま「次へ」をクリック。
(「新しいインフラストラクチャ設定を作成する」を選択した場合、インスタンスタイプや実行VPC、SecurityGroup、Image Builderから通知とアラートを受信するためのSNSトピック、ログの保存場所等、選択可能になるようです。)


ディストリビューション設定もデフォルトのまま「次へ」をクリック。

内容を確認して「パイプラインを作成する」をクリック。


無事パイプラインが作成されました。


Cloudformationで同じパイプラインを作成してみる。

前章で作成したリソースをテンプレートで表現するという練習で、ユーザーガイドとマネコンを見比べて作成したテンプレートが以下になります。

ec2_image_builder_practice.yml
ec2_image_builder_practice.yml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  # ------------------------------------------------------------#
  # ImageBuilder
  # ------------------------------------------------------------#
  ImagePipeline:
    Type: AWS::ImageBuilder::ImagePipeline
    Properties:
      DistributionConfigurationArn: !Ref DistributionConfiguration
      EnhancedImageMetadataEnabled: true
      ImageRecipeArn: !Ref ImageRecipe
      InfrastructureConfigurationArn: !Ref InfrastructureConfiguration
      Name: test2
      Status: ENABLED

  ImageRecipe:
    Type: AWS::ImageBuilder::ImageRecipe
    Properties: 
      AdditionalInstanceConfiguration: 
        SystemsManagerAgent:
          UninstallAfterBuild: false # default
      BlockDeviceMappings: 
        - DeviceName: /dev/xvda (root)
          Ebs: 
            DeleteOnTermination: true
            Encrypted: false
            Iops: 100
            VolumeSize: 8
            VolumeType: gp2
      Components: 
        - ComponentArn: arn:aws:imagebuilder:ap-northeast-1:aws:component/aws-cli-version-2-linux/1.0.4/1
        - ComponentArn: arn:aws:imagebuilder:ap-northeast-1:aws:component/inspector-test-linux/1.0.6/1
        - ComponentArn: arn:aws:imagebuilder:ap-northeast-1:aws:component/reboot-test-linux/1.0.0/1
        - ComponentArn: arn:aws:imagebuilder:ap-northeast-1:aws:component/simple-boot-test-linux/1.0.0/1
        - ComponentArn: arn:aws:imagebuilder:ap-northeast-1:aws:component/yum-repository-test-linux/1.0.0/1
      Name: test-recipe2
      ParentImage: arn:aws:imagebuilder:ap-northeast-1:aws:image/amazon-linux-2-arm64/x.x.x
      Version: 1.0.0
      WorkingDirectory: /tmp

  InfrastructureConfiguration:
    Type: AWS::ImageBuilder::InfrastructureConfiguration
    Properties: 
      InstanceProfileName: EC2InstanceProfileForImageBuilder #?
      Name: test-InfrastructureConfiguration2
      TerminateInstanceOnFailure: true

  DistributionConfiguration:
    Type: AWS::ImageBuilder::DistributionConfiguration
    Properties: 
      Distributions:
        - Region: ap-northeast-1
      Name: test-DistributionConfiguration2

発生した構文エラー

上記を実行した所、発生したエラーが以下になります。

直訳/「パラメータ 'distributions[0]' に指定された値は、有効ではありません。ディストリビューション構成では、地域ごとに1つまたは複数の出力を提供する必要があります。」
Resource handler returned message: "The value supplied for parameter 'distributions[0]' is not valid. One or more outputs should be provided for each region in a distribution configuration. (Service: Imagebuilder, Status Code: 400, Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)" (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: GeneralServiceException)

作成したDistributionConfigurationブロック

該当部分
  DistributionConfiguration:
    Type: AWS::ImageBuilder::DistributionConfiguration
    Properties: 
      Distributions:
        - Region: ap-northeast-1
      Name: test-DistributionConfiguration2

ユーザーガイド

全ての設定項目

  AmiDistributionConfiguration: 
    AmiDistributionConfiguration
  ContainerDistributionConfiguration: 
    ContainerDistributionConfiguration
  FastLaunchConfigurations: 
    - FastLaunchConfiguration
  LaunchTemplateConfigurations: 
    - LaunchTemplateConfiguration
  LicenseConfigurationArns: 
    - String
  Region: String

問題部分の説明「必須:いいえ」と記載有。


cdkで同じ事にひっかかっていた方

https://github.com/aws/aws-cdk/issues/12882

結果

以下で通りました。
  DistributionConfiguration:
    Type: AWS::ImageBuilder::DistributionConfiguration
    Properties: 
      Distributions:
        - Region: ap-northeast-1
	  AmiDistributionConfiguration:
            Name: testAmiCopyConfiguration - {{ imagebuilder:buildDate }}
      Name: test-DistributionConfiguration2

ドキュメントへのフィードバック

https://repost.aws/ja/knowledge-center/feedback-errors-documentation

「AmiDistributionConfigurationは必須だったりしないでしょうか」としてフィードバックを送信しました。

終わりに

以上でした。どなたかの不毛な時間が短縮されていれば嬉しいです。
お読みいただき有難うございました。

デベキャン

Discussion