AWS Protonで独自のProtonテンプレートを作成する

2022.01.23

いわさです。

AWS ProtonではProtonテンプレートを提供することで、開発チームが迅速にプラットフォームチームの基準を満たすインフラ環境を構築することが出来ます。
本日は、このProtonテンプレートを作成してみたいと思います。

CloudFormationやTerraformのIaCテンプレートを流用出来ますが、Proton用に少し追加の対応が必要です。
具体的には、IaCテンプレートの他にデータスキーマ定義ファイルとマニフェストファイルを同梱し、バンドルを作成する必要があります。

バンドルを作成する

本日は以下の最小限のCloudFormationテンプレートを使います。
VPCを作成するだけのものです。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Parameters:
  vpcCidr:
    Description: ---
    Type: String
    Default: 10.0.0.0/16
Resources: 
  myVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref vpcCidr
      EnableDnsSupport: true
      Tags:
        - Key: keyname
          Value: value

入力パラメータ使用部分をProton用に修正する

Protonでは後述のデータスキーマファイルで入力パラメータを定義し、その値をテンプレート上で使用します。
通常はCloudFormationではParameter句を使うと思いますが、Jinja形式で変数を指定してパラメータを使用します。

hoge-cfn.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: ---
# Parameters:
#   vpcCidr:
#     Description: ---
#     Type: String
#     Default: 10.0.0.0/16
Mappings:
  SubnetConfig:
    VPC:
      CIDR: '{{ environment.inputs.vpc_cidr}}' 
Resources: 
  myVPC:
    Type: AWS::EC2::VPC
    Properties:
      # CidrBlock: !Ref vpcCidr
      CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR']
      EnableDnsSupport: true
      Tags:
        - Key: keyname
          Value: value

Terraformの場合はJinja形式ではなく、内部変数var.environment.input.vpc_cidrを使います。
ファイル名は任意で良いです。

データスキーマを定義する

テンプレートから参照する入力パラメータを定義した、OpenAPIデータモデルのスキーマファイルを作成します。

schema.yaml

schema:
  format:
    openapi: "3.0.0"
  environment_input_type: "HogeInput"
  types:
    HogeInput:
      type: object
      description: "---"
      properties:
        vpc_cidr:
          type: string
          description: "VPC CIDR"
          default: 10.0.0.0/16
          pattern: ([0-9]{1,3}\.){3}[0-9]{1,3}($|/(16|24)

デフォルトのVPC CIDRと入力形式を設定しています。
ファイル名はschema.yamlである必要があります。ファイル名が異なる場合、後ほどアップロード時以下のエラーになります。

File(s): [Schema file] is/are missing or not in the correct directory.

マニフェストファイルを作成する

IaCテンプレートファイル名と実装言語の定義を行うマニフェストファイルを新規作成します。

infrastructure:
  templates:
    - file: "hoge-cfn.yaml"
      rendering_engine: jinja
      template_language: cloudformation

ファイル名はmanifest.yamlである必要があります。
こちらもファイル名が異なる場合はアップロード時にエラーとなります。

File(s): [Infrastructure manifest file] is/are missing or not in the correct directory.

バンドルアップロード

テンプレート、スキーマ、マニフェストは以下の形式で配置し、tar.gzip形式にまとめた、S3バケットへアップロードしておきます。
最近git同期機能が登場しましたが、この記事ではその新機能には触れません。

iwasa.takahito@hoge 20220123proton-template % tar zcvf hoge.tar.gz .

Protonテンプレートとして取り込み

S3へアップロードしたバンドルをProtonコンソールから取り込みます。
バンドルソースで「独自のテンプレートバンドルを使用」を選択します。

ファイルや配置に問題があればこの段階で取り込みエラーとなります。
問題なければテンプレートステータスがDraftとなるので、利用するために公開します。

これでカスタムProtonテンプレートを利用出来るようになりました。

テンプレートを使う

利用方法は環境の作成から先程作成したテンプレートを選択するだけです。
サンプルテンプレートを同じです。

途中、必須パラメータを入力しますが、入力形式にエラーがあった際はデプロイのタイミングでエラーとなり、デプロイが中断されます。

テンプレートから作成されたスタックを確認してみます。

スタック名はAWSProton-から始まりますが、タグなどでの紐付けはされていません。
CloudFormation画面から見ると、スタック名でしかProtonで作成されたものだとは判断出来ないようです。

作成されたリソース(VPC)にはCloudFormationのスタック名、スタックIDがタグとして設定されます。
直接的な関連付けはされていませんが、タグのスタック名からProtonで作成されたリソースだと、かろうじて判断は出来そうです。

テンプレートの削除

不要になったテンプレートはテンプレート一覧から削除が可能です。

しかし、対象テンプレートが環境で利用されている場合は削除が出来ませんので、まず環境を先に削除する必要があります。

さいごに

本日はAWS Protonでカスタムテンプレートを作成してみました。
CloudFormationのテンプレート開発+αで追加の対応が必要ですが、テンプレート提供が出来たり、テンプレートのバージョン管理、環境との関連付けなど手間以上の恩恵があるかなと思います。

普段、検証用に様々なテンプレート作ってますが全部Protonにしてしまおうかなと、ちょっと思いました。