AWS CloudFormation/AWS SAMのテンプレートをJSON Schemaでリアルタイムバリデーションする

2022.04.03

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、AWS CloudFormationおよびAWS SAMのテンプレートのJSON Schemaによるリアルタイムバリデーションを試してみました。

前提

Visual Studio Codeでテンプレートの編集を行う前提とします。

JSON Schemaとは

JSON Schemaとは、JSON(YAML)ドキュメントのアノテーションやバリデーションの規格を行うオープンソースプロジェクトです。

JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.

JSON Schemaでは様々な様々なドキュメントの規格に対応しており、対応ドキュメントの一覧は下記で確認可能です。

GitHub Repositoryでなら下記からも確認できます。

やってみた

Json Schemaの導入

下記のYAMLというExtensionをVS Codeにインストールするだけです。

提供はRed Hat社のようですね。

YAMLではJSON Schemaをサポートしており、導入すると対応しているドキュメントで自動的に利用可能となります。

使用しているドキュメントがJSON Schemaに対応している場合は、ファイル上部に下記のようなリンクが表示されます。

これをクリックして開くとJSON Schemeのソースを確認することができます。

CloudFormationテンプレートのバリデーション

CloudFormationテンプレートのJSON Schemaのソースは下記となります。バリデーション対象となるファイル名や、ソースのURLが確認できます。

src/api/json/catalog.json

    {
      "name": "AWS CloudFormation",
      "description": "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.",
      "fileMatch": [
        "*.cf.json",
        "*.cf.yml",
        "*.cf.yaml",
        "cloudformation.json",
        "cloudformation.yml",
        "cloudformation.yaml"
      ],
      "url": "https://raw.githubusercontent.com/awslabs/goformation/master/schema/cloudformation.schema.json"
    },

次のようなCloudFormationテンプレートで確認してみます。

cloudformation.yaml

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

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties: 
      ImageId: "ami-0ff8a91507f77f867"
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20

必須プロパティを指定しない場合はバリデーションエラーとなります。

赤波線にマウスオーバーすると、アノテーションを確認することもできます。これによりバリデーションエラーの内容が分かります。

リソース名が重複した時もバリデーションエラーとなります。

プロパティで使用できない値を指定した時もバリデーションエラーとなります。

プロパティで指定できない型の値を指定した場合もバリデーションエラーとなります。

SAMテンプレートのバリデーション

SAMテンプレートのJSON Schemaのソースは下記となります。

src/api/json/catalog.json

    {
      "name": "AWS CloudFormation Serverless Application Model (SAM)",
      "description": "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.",
      "fileMatch": [
        "serverless.template",
        "*.sam.json",
        "*.sam.yml",
        "*.sam.yaml",
        "sam.json",
        "sam.yml",
        "sam.yaml"
      ],
      "url": "https://raw.githubusercontent.com/awslabs/goformation/master/schema/sam.schema.json"
    },

次のようなSAMテンプレートで確認してみます。

sam.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample SAM Template for sam-app

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api 
          Properties:
            Path: /hello
            Method: get

バリデーションの行われ方はCloudFormationの場合と基本的に同じです。

下記は必須プロパティが無い場合のバリデーションエラーです。

参考

以上