AWS Protonでテンプレートをバージョンアップする

2022.01.24

いわさです。

先日AWS Protonで独自のテンプレートを用意する方法を紹介させていただきました。

テンプレートではバージョンの概念があり、テンプレートを使った環境やサービスも同様にバージョンを管理することが出来ます。

バージョンアップ

登録済みテンプレートのバージョンタブから新しいバージョンを登録することが可能です。
更新したテンプレートバンドルを用意し、テンプレート作成時と同じ流れでS3から登録を行います。

登録時にバージョンをマイナーバージョンとするか、メジャーバージョンとするか指定が可能です。

考え方としては、下位互換性があり破壊的な更新がなくテンプレート利用者が意識せずにバージョンアップを行うことが出来るものはマイナーバージョン、下位互換性がなかったり破壊的な更新が必要な場合はメジャーバージョンを指定するのが良いでしょう。
また、Protonが更新されたテンプレートに下位互換性があるかをベストエフォートで判断してくれます。

マイナーバージョンアップと、メジャーバージョンアップの挙動を確認し、Protonの互換性確認機能も見てみます。

マイナーバージョン

まずはマイナーバージョンアップを試してみます。

環境側では更新されたマイナーバージョンが公開されると、環境のバージョンアップが推奨されます。

更新可能なマイナーバージョンが存在していると、アクションメニューから「マイナーを更新」が選択出来るようになります。

更新後、環境が推奨バージョンになっていることが確認出来ました。

メジャーバージョン

次にメジャーバージョンアップを試してみます。

推奨されたメジャーバージョンが公開された場合、先程と同じようにアップデート可能な旨がアイコンでわかるようになります。
アップデート可能というより、エラー・警告に近い色とアイコンですね。強めにアップデートを推奨している感じがします。

アップデート方法は同じで、アクションメニューから今度は「メジャーを更新」を選択するだけです。

更新可能なバージョンがメジャー&マイナーで混在しているとき

ちなみにターゲットとなる環境に更新可能なメジャーバージョンとマイナーバージョンが混在していた場合はどのようなアップデートが可能か確認してみました。

v1.2の環境がデプロイされていて、テンプレートはv1.3とv2.0とv2.1が存在している場合です。

更新メニューで選択出来るのは、「メジャーを更新」のみでした。
更新してみましょう。

一気にv2.1まで更新されました。
公開されている推奨のメジャーマイナーバージョンで更新するようです。

Protonによる互換性評価

冒頭で少し触れましたが、Protonが互換性を評価し、マイナーバージョンアップではなくメジャーバージョンアップをテンプレート登録時に強制する場合があります。
具体的には、「スキーマを更新し、ユーザーからの新たなパラメータ入力が必要になった場合」が該当します。

VPC CIDRを指定するスキーマに対し、動的タグ入力させるように変更してみます。

schema.yaml

schema:
  format:
    openapi: "3.0.0"
  environment_input_type: "HogeInputType"
  types:
    HogeInputType:
      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_tag:
          type: string
          description: "VPC TAG"
          default: hogetag
      required:
        - vpc_cidr
        - vpc_tag

この状態で、マイナーバージョンアップとしてテンプレートを登録すると以下のようになります。

New template schema is non-backwards compatible with prior minor version

このメッセージが表示された場合は、メジャーバージョンアップとして登録し直す必要があります。

この互換性評価はユーザーの追加の入力が必要かどうかが観点のようでして、パラメータが必須ではない場合はマイナーバージョンとして登録可能です。
先ほどのテンプレートだとrequiredから削除するとマイナーバージョンとして登録が出来ます。

この互換性評価、かなり気をつける点がありまして、IaCテンプレートの互換性を評価するものではありません。
極端な話、以下のように全く別のスタック構成のCloudFormationだとしても、Protonの互換性評価上はマイナーバージョンとして登録出来てしまいます。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Mappings:
  SubnetConfig:
    VPC:
      CIDR: '{{ environment.inputs.vpc_cidr}}' 
      TAG: '{{ environment.inputs.vpc_tag}}'
Resources: 
  # myVPC:
  #   Type: AWS::EC2::VPC
  #   Properties:
  #     CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR']
  #     EnableDnsSupport: true
  #     EnableDnsHostnames: true
  #     Tags:
  #       - Key: keyname
  #         Value: value
  #       - Key: Name
  #         Value: hoge-vpc
  #       - Key: Hoge
  #         Value: !FindInMap ['SubnetConfig', 'VPC', 'TAG']
  s3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      AccessControl: Private
      BucketName: hoge-bucket-20220124-iwasa
      Tags:
        - Key: key
          Value: value

Protonによる互換性評価はあくまでもスキーマのみの補間的なものであり、テンプレート管理者が互換性の評価を行うようにしましょう。

さいごに

本日はProtonテンプレートのバージョンアップ方法を紹介しました。

テンプレートと関連した環境のバージョンまで管理出来ることで、テンプレートバージョンアップ時にはProtonコンソールから利用者が最新バージョンが存在することを認識し、利用者の判断でバージョンアップ作業が出来ることを確認しました。

メジャーバージョン、マイナーバージョンの考え方とテンプレート利用者からの見え方と、そしてテンプレートの互換性とデプロイ済みの既存環境への影響をどうクリアするかについてはProtonに任せるのではなくテンプレート管理者が担保する必要があるという点を理解しておきましょう。