🎏

CloudFormationテンプレート Metadata(Interface) 解説

2022/09/12に公開約3,700字

はじめに

Metadataセクションでは、以下の定義が利用可能です。

  • AWS::CloudFormation::Init
  • AWS::CloudFormation::Authentication
  • AWS::CloudFormation::Interface
  • AWS::CloudFormation::Designer

InitはEC2インスタンスでアプリケーションの設定を行う場合に利用します。
AuthenticationはInitで扱うファイル内で認証情報を扱う場合に利用します。
DesignerはCloudFormationのデザイナー機能の設定を行う場合に利用します。
これら三つはアーキテクチャや現場によって採用されないケースが多いので、説明を割愛します。

では本題のAWS::CloudFormation::Interfaceです。
このプロパティはCloudFormationのパラメータの煩雑さを解消する役割を持ちます。
具体的な例を以下でご紹介します。

Metadataセクション(Interface)の使い方

AWS::CloudFormation::Interfaceを利用しない場合

template.yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  TableName:
    Type: String
  HashAttributeName:
    Type: String
  RangeAttributeName:
    Type: String
  BucketName:
    Type: String
  ObjectLockEnabled:
    Type: String
    AllowedValues:
      - true
      - false
Resources: 
  dynamodbTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: !Ref HashAttributeName
          AttributeType: S
        - AttributeName: !Ref RangeAttributeName
          AttributeType: S
      KeySchema:
        - AttributeName: !Ref HashAttributeName
          KeyType: HASH
        - AttributeName: !Ref RangeAttributeName
          KeyType: RANGE
      BillingMode: PAY_PER_REQUEST
      TableName: !Ref TableName
  s3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Ref BucketName
      ObjectLockEnabled: !Ref ObjectLockEnabled

DynamoDBとS3を作成するテンプレートです。
このサンプルテンプレートではパラメータが以下の順で定義されています。

  • TableName
  • HashAttributeName
  • RangeAttributeName
  • BucketName
  • ObjectLockEnabled

一見テンプレート内では、整理されているように見えますが、スタック作成時のパラメータ入力欄を見ると以下のようになっています。

テンプレートで定義した順序と違い、S3とDynamoDBの設定が入り乱れています。
見づらいですね。
もっとパラメータの数が増えるともはや何のリソースの設定なのか、わからなくなりそうです。

AWS::CloudFormation::Interfaceを利用する場合

template.yaml
AWSTemplateFormatVersion: 2010-09-09
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label: 
          default: DynamoDB Configuration
        Parameters: 
          - TableName
          - HashAttributeName
          - RangeAttributeName
      - 
        Label: 
          default: S3 Configuration
        Parameters: 
          - BucketName
          - ObjectLockEnabled

Parameters:
  TableName:
    Type: String
  HashAttributeName:
    Type: String
  RangeAttributeName:
    Type: String
  BucketName:
    Type: String
  ObjectLockEnabled:
    Type: String
    AllowedValues:
      - true
      - false
Resources: 
  dynamodbTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: !Ref HashAttributeName
          AttributeType: S
        - AttributeName: !Ref RangeAttributeName
          AttributeType: S
      KeySchema:
        - AttributeName: !Ref HashAttributeName
          KeyType: HASH
        - AttributeName: !Ref RangeAttributeName
          KeyType: RANGE
      BillingMode: PAY_PER_REQUEST
      TableName: !Ref TableName
  s3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Ref BucketName
      ObjectLockEnabled: !Ref ObjectLockEnabled

ParameterGroups > Label > defaultでパラメータグループにラベルをつけることができ、Parametersで順序を指定することができます。
このテンプレートでパラメータ入力画面を開くと以下のようになります。

ちゃんとグルーピングされ、タイトルが表示されています。🎉
見やすくオペミスも減らせそうですね!
グルーピングはサービス毎に行うのがおすすめです。
またグルーピング内の順序もテンプレートで定義したものと同じように表示されています。

最後に

Metadataセクションは他のセクションに比べて軽視されやすいです。
確かに定義しなくてもCloudFormationは動作させれますが、規模が大きくなるほどメンテナンス面で大きな役割を果たします。
「パラメータが見にくいな」と感じたらぜひ導入してみてください!

Discussion

ログインするとコメントできます