実践!AWS CDK #6 Metadata

題字・息子たち
2021.05.31

はじめに

今回は Metadata について学んでいきましょう。

前回の記事はこちら。

Metadata とは

CFn の テンプレートセクション の 1 つです。
このセクションを利用して、開発者はテンプレートに関する追加情報を付与することができます。任意項目なので無くても問題ありません。

AWSTemplateFormatVersion: "2010-09-09"
Description: "sample template"

Metadata:
  StarWars:
    EpisodeIV: "A New Hope"
    EpisodeV: "The Empire Strikes Back"
    EpisodeVI: "Return of the Jedi"

Resources:
  Vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample-vpc

全く関係のないスター・ウォーズの情報を入れてみました。このように Metadata セクションには任意のオブジェクトを含めることができます。

また以下のようなリソース(メタデータキー)を Metadata セクション配下に記述することで特定の処理を実行することもできますが、ここでの説明は割愛します。

AWS CDK における Metadata

AWS CDK ではデフォルトでこの Metadata が各リソースに付与され、さらにこれとは別の AWS::CDK::Metadata というリソースが含まれます。

今まで ~ 省略 ~ と濁してきましたが、空のプロジェクトを作成して cdk synth コマンドを実行しただけで次のようなテンプレートが出力されます。(長いです)

Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAAEzPUMzQw0TNQdEgsL9ZNTsnWT84vStWrDi5JTM7Wcc7PKy4pKk0u0XFOywtKLc4vLUpOBbGBEimZJZn5ebU6efkpqXpZxfplhmZ6hkCDsoozM3WLSvNKMnNT9YIgNAAtXENFZQAAAA==
    Metadata:
      aws:cdk:path: DevioStack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - af-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-2

長い。(2 回目)

これは何?

AWS CDK の改善に利用される情報です。
AWS チームはこれらの情報を収集/分析し、AWS CDK がどのように使われているかを把握しているようです。

The AWS CDK team uses this metadata to gain insight into how the AWS CDK is used, so we can continue to improve it.

利用情報を提供することは全く構わないのですが、いかんせんノイズが多すぎます。リソース 0 の状態で 80 行 存在するので、今後リソースを追加していった場合に確認したい項目が埋もれ見落としてしまう危険もあります。

というわけで AWS さんすみません。私、オフりますね。

除外設定

除外する方法は 2 通りです。

  • 設定ファイルで書く
  • コマンドのオプションを指定する

私は設定ファイルに書くことにしました。

cdk.json を次のように修正します。

cdk.json

{
  "app": "npx ts-node --prefer-ts-exts bin/devio.ts",
  "versionReporting": false,
  "context": {
    "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    "aws-cdk:enableDiffNoFail": "true",
    "@aws-cdk/core:stackRelativeExports": "true",
    "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true,
    "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true,
    "@aws-cdk/aws-kms:defaultKeyPolicies": true,
    "@aws-cdk/aws-s3:grantWriteWithoutAcl": true,
    "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true,
    "@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
    "@aws-cdk/aws-efs:defaultEncryptionAtRest": true,

    "systemName": "devio",
    "envType": "stg"
  }
}

"versionReporting": false これだけです。

この状態で cdk synth を実行すると先程の出力がキレイに無くなります。

設定ファイルではなくコマンドで除外する場合は --no-version-reporting オプションを指定します。

$ cdk synth --no-version-reporting

あと一歩

実はまだ各リソースに Metadata が含まれているんですよ。

Resources:
  Vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: devio-stg-vpc
    Metadata:
      aws:cdk:path: DevioStack/Vpc
~ 省略 ~

せっかくなんで、こいつもなくしちゃいましょう。
こちらは残念ながらコマンドオプションのみでの対応となります。以下のいずれかで除外可能です。

  • --path-metadata false
  • --no-path-metadata
    • ただしこちらはドキュメントに記載なし

(上記の規則に従い "pathMetadata": false を設定ファイルに追記してもダメでした)

以上で Metadata が存在しない、CFn を手動で作成した時と同等のテンプレートを出力することができました。
aws:cdk:path の Metadata も気になる方は、今後 cdk synth, cdk deploy コマンド実行時に --path-metadata false オプションも付けるようにしてください。(私です)

GitHub

今回のソースコードは コチラ です。

おわりに

細かい部分かもしれませんが、ノイズの除去は良い仕事をする上で非常に重要な要素だと思います。今後も AWS CDK を触っていく中で、気になることがあれば 1 つずつ改善していきたいです。

リンク