CloudFormationでAWS::NoValue擬似パラメータを使った話

記事タイトルとURLをコピーする

こんにちは、2022年10月にサーバーワークスに入社した大城と申します。現在AS部IE課でAWS修行中です。研修で CloudFormation をはじめて触る機会があり勉強になったことがあったので備考録としてブログに残します。

はじめに

研修で実施した模擬案件(※)でステージング環境と開発環境を同じような構成で構築することになりました。AWSマネージメントコンソールからポチポチ作成しても良かったのですが社内に CloudFormation を利用したナレッジが多くあったので活用することにしました。

※ 模擬案件については弊社サバワクの記事をご覧ください

sabawaku.serverworks.co.jp

sabawaku.serverworks.co.jp

模擬案件でやったこと

EC2の要件

模擬案件のステージング環境と開発環境の EC2 インスタンスタイプは別の要件でした。

  • ステージング環境:m5.large
  • 開発環境:t3.nano

また、バーストインスタンスタイプである t3.nano の Unlimited モードはデフォルトの unlimited ではなく standard にする要件でした。

バーストパフォーマンスインスタンスの Unlimited モード - Amazon Elastic Compute Cloud

T4g、T3a、および T3 インスタンスは、デフォルトで unlimited として起動します。

最初に作ったテンプレート

ステージング環境、開発環境で共通している部分が多いので1つの CloudFormation テンプレートで実現できないか試行錯誤していました。

ステージング環境:m5.large
テンプレートをハードコードすると下記の通りです。(必要な箇所だけ抜粋しています)

AWSTemplateFormatVersion: "2010-09-09"
# <省略>
Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: m5.large
# <省略>

開発環境:t3.nano
テンプレートをハードコードすると下記の通りです。(必要な箇所だけ抜粋しています)

AWSTemplateFormatVersion: "2010-09-09"
# <省略>
Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: t3.nano
      CreditSpecification:
        CPUCredits: standard
# <省略>

InstanceType については Parameters で純粋に指定すれば良いので特に悩みませんでした。
2つのテンプレートを見て分かる通り、ステージング環境はバーストインスタンスタイプではないため Resources.EC2Instance.Properties.CreditSpecification が不要です。テンプレートに記載するとスタック作成時にエラーになってしまいます。いろいろ悩みましたが CloudFormation テンプレートを2つに分けてレビュー依頼しました。

レビューでのアドバイス

Fn::If条件関数とAWS::NoValue擬似パラメータを使う事で1つにできるか試してみてください」とアドバイスをもらいました。 AWS::NoValue?何それ状態でした。それぞれのリファレンスを見ました。

条件関数 - AWS CloudFormation

擬似パラメータ参照 - AWS CloudFormation

弊社のブログで参考になるものありました。最初にこれ読んでいれば…

blog.serverworks.co.jp

修正したテンプレート

バーストインスタンス true or false をスタック作成時に選択してもらうことにしました。falseの場合はAWS::NoValueResources.EC2Instance.Properties.CreditSpecification を削除する作りにしました。

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  InstanceTypeParameter:
    Type: String
    Default: t3.nano
  IsBurstType:
    Type: String
    AllowedValues: ['true', 'false']
# <省略>
Conditions:
  IsBurstType: 
    Fn::Equals: ['true', !Ref IsBurstType]
# <省略>
Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: !Ref "InstanceTypeParameter"
      CreditSpecification:
        Fn::If:
          - IsBurstType
          - CPUCredits: standard
          - !Ref "AWS::NoValue"
# <省略>

最後に

ここまで読んで頂きありがとうございます。一応これでOKもらって動きましたが「IsBurstTypeパラメータ指定よりFn::OrとかFn::Equals使ってInstanceTypeがバーストインスタンスか判定できるとよりスマートですね!」というコメントもらいました。レビューしてもらうことで勉強になること多いですね。次にテンプレート作るときはもう少し工夫してみようと思いました。

大城 慶明 (記事一覧)

マネージドサービス部

2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS12冠。NRUG沖縄支部運営。X @yo_ohshiro