🐠

CFnのMetadataの4つの"メタデータキー"のドキュメントを読んでそれぞれの役割についてわかった事。

2022/10/19に公開

■ CFnテンプレートでMetadataといえば..

「スタック作成者に手入力や選択を求めるParamerter項目の上下の”並び順”を指定する時に使う項目」というような印象でした。

参考: 「CloudFormationでパラメータ入力順を指定する方法」

そういえば、EC2(※Type : AWS::EC2::Instance)の中にも”Metadata:”があります。

「2つの関連は?」

良い機会だと思ったので全体像をしっかり把握したいと思います。

記事全体がかなり公式ドキュメントに依存しています。

テンプレートの作成に着手して6日目の初学者である私が「実際に使い倒した結果」をお届けする事も出来ないのでこの記事は「ドキュメントから理解してみようとした話」である事を念頭にお付き合いいただければ幸いです。


■ 今回の主題「メタデータキー」

ドキュメントを開くと目に飛び込んできます。

どうやらこれがテンプレート内でのメタデータという機能を分類するのものであろうという事がわかります。

3種類あるようです

※以下そのまま引用です。

AWS::CloudFormation::Init

cfn-init ヘルパースクリプトの設定タスクを定義します。このスクリプトは、EC2 インスタンスでアプリケーションの設定とインストールを行う場合に便利です。

AWS::CloudFormation::Interface

AWS CloudFormation コンソールに表示される場合の入力パラメーターのグループ化と順序を定義します。デフォルトでは、AWS CloudFormation コンソールではパラメーターが論理 ID によりアルファベット順にソートされます。

AWS::CloudFormation::Designer

AWS CloudFormation デザイナー (デザイナー) におけるリソースのレイアウトを記述します。この情報を使用してテンプレートを作成および更新すると、デザイナー によりこの情報が自動的に追加されます。

と思いましたがドキュメントの左側の目次には「::Designer」が見受けられない変わりに「::Authentication」という表示があります。(4種類あるのかな・・?)

この時点では確信がありませんが、記事の終わりには構造を把握していたいところです。

冒頭の記事を読む限り「Parameter項目の並び替え」には真ん中の「::Interface」が使われているという事だけがわかっています。

■ 他の記事ではこのように扱われています。

冒頭と同じように「Parametrの並び順を変更する」を扱ったこちらの記事に、作成者による以下ような見解がありました。

AWS::CloudFormation::Interface
 → 今回使用するもの、入力パラメータのグループ化と順序が指定できます
AWS::CloudFormation::Init
 → cfn-init ヘルパースクリプトを EC2 インスタンスで使用する際に定義します
AWS::CloudFormation::Designer
 → AWS CloudFormation デザイナーを使用すると自動追加されます

更に同じテーマの別の記事では

AuthenticationはInitで扱うファイル内で認証情報を扱う場合に利用

と先ほど目次内のみに存在していた「::Authentication」にも触れ、”4種類”と括ってくれています。

■ 改めて、ひとつずつ理解したいと思います。

「::Interface」について(結果)

名前からして、並び順(グルーピング含め)以外にも色々出来る事がありそうだなと思っていたのですが、ネット上からその他の機能を探しても、公式ドキュメントを読んでも現在の所他に期待していたような機能はなさそうです。

”パラメーターのグルーピング・並び順を設定する為に存在するメタデータキー”
だと理解しました。


「::Designer」について(結果)

公式ドキュメント「AWS CloudFormation デザイナー を使用する理由」内で

すべてのレイアウト情報は AWS::CloudFormation::Designer メタデータキーで定義されます。このキーは、デザイナー によってのみ使用されるため、AWS CloudFormation スタックの作成を妨害することはありません。次のテンプレートメタデータの例は、デザイナー がメタデータとしてテンプレートに追加するレイアウト情報を示しています。

Metadata:
  'AWS::CloudFormation::Designer':
    6b56eaae-0bb6-4215-aad6-12345EXAMPLE:
      size:
        width: 60
        height: 60
      position:
        x: 340
        'y': 430
      z: 2
      parent: 21ccc9b0-29e9-4a86-9cf2-12345EXAMPLE
      embeds: []
      ismemberof:
        - c3eead73-6a76-4532-9268-12345EXAMPLE
...

と説明しています。

また「【AWS CloudFormation入門】 初心者が気をつけたいこと5つ」の1つとして

CloudFormationデザイナーで、コードを編集するのはやめておいた方がいいです。
メタデータが付くため、バージョン管理するときに差異がわかりづらくなります。

という経験者による見解もあります。

自ら進んで設定するためのものではなく、
"デザイナーというGUI上でリソースを配置した際、座標や関連性を保持する為に自動生成されるもの"という理解で問題なさそうです。


「::Init」について(結果)

結構一生懸命読みましたが、「細かいところは実際に使ってみないとわからないな」というくらいボリュームがありました。

わかった事をいくつか纏めます。

ざっくりいうと、

”EC2の中でcfn-init ヘルパースクリプトとして後で呼び出しする為に加工したり纏めたりした情報を定義するメタデータキー”なのだと理解しました。

まずは"コンフィグセット"とその中にある"コマンド"について

・利用可能な項目は違えどLinuxでもWindowsでも動作する。

参照可能な”コマンド(群)”を
”コンフィグ”という物の中に纏めて 更に、
”コンフィグセット”という「実行順序を制御して定義」して纏めた「セット」を、
”コンフィグセッツ(複数系)”内に格納

する。(ような書き方をしている。)という事。

※肝心の”コマンド”で出来る事については、ドキュメント内の「表」と「例」がめちゃくちゃよく出来ていてわかりやすいです。これはもうドキュメント内の「例」をそのまま読んだ方がストンとくると思います。

テンプレート内での記述としては

Resources:
  インスタンス論理ID:
    Type : AWS::EC2::Instance
    Metadata :
      AWS::CloudFormation::Init :
 ...

という構造で使っているのですが、

パラメーターの並び順変更の際に「Parameter」や「Resource」と同列のインデントにある「Metadata 」内で「::Interface」を使っているのと、

このメタデータキーが、
Resource→EC2の「論理ID」→「Metadata」→「::Init(メタデータキー)」
というインデントで記述されている事になんだか気持ち悪さを勝手に感じていたのですが、

これはもう完全に”そういうもの”(という暫定理解)にする事にしました。

ここはYamlの記法やこういう階層(?)構造についての理解の浅さによる所もあるかと思います。
正しく噛み砕けていないので釈然としていないのですが、わかり次第Updateしたいと思います。

その他にも、”コマンド”と並んで..

・EC2 インスタンス上にファイルを作成する”ファイル”

・Linux/UNIX グループを作成して、グループIDを割り当てる”グループ”

・パッケージ済みのアプリやコンポーネントをダウンロードしてインストールする”パッケージ”

・インスタンスの起動時各サービスを有効化/無効化するかを定義する”サービス”

などの機能があるようですが、使ってみないと肌感がわからなそうです。

【再掲】AWS::CloudFormation::Initのドキュメント


「::Authentication」について(結果)

この機能に言及した記事が殆どみつかりませんでした。

ドキュメントを3周読んでみた結果ですが、

・「::Init」と同じく、

Resources:
  インスタンス論理ID:
    Type : AWS::EC2::Instance
    Metadata :
      AWS::CloudFormation::Init :
     (Initの内容〜)
      AWS::CloudFormation::Authentication :
       (Authenticationの内容〜)
 ...

「Type : AWS::EC2::Instance」内のこの場所で使うようです。

以下の「例」を見る限り、

「::Init:」内で”認証情報の場所”というメタデータを指定(或いは作成?/ここではS3バケット)し、
「::Authentication」でアクセスキーIDや、シークレットキーの値を実際に指定している。。ように見えます。

WebServer: 
  Type: AWS::EC2::Instance
  DependsOn: "BucketPolicy"
  Metadata: 
    AWS::CloudFormation::Init: 
      config: 
        packages: 
          yum: 
            httpd: []
        files: 
          /var/www/html/index.html: 
            source: 
              Fn::Join: 
                - ""
                - 
                  - "http://s3.amazonaws.com/"
                  - Ref: "BucketName"
                  - "/index.html"
            mode: "000400"
            owner: "apache"
            group: "apache"
            authentication: "S3AccessCreds"
        services: 
          sysvinit: 
            httpd: 
              enabled: "true"
              ensureRunning: "true"
    AWS::CloudFormation::Authentication: 
      S3AccessCreds: 
        type: "S3"
        accessKeyId: 
          Ref: "CfnKeys"
        secretKey: 
          Fn::GetAtt: 
            - "CfnKeys"
            - "SecretAccessKey"
Properties: 
  EC2 Resource Properties ...

■ 終わりに。

実際には使ってみないと正確な理解は得られなそうだった。ではありますが、ドキュメントを読むだけでも「全体像とそれぞれの役割」についてはかなり触れられたのではないかと思います。

CloudFormationはドキュメントを読めば読むほど面白くなりそうなので引き続き頑張って学んでみたいと思います。

お付き合いいただき有難うございました!!

Discussion