AWS CloudFormationのConditionsセクションを使用する

現場ではCloudFormationで自動的にEC2作成する要件があります。
しかしミドルウェアのライセンス数が限られ、かつvCPUライセンスで課金され、メモリが満たされた上に、vCPU数を制限し、EC2を作成する必要があります。

固定でCoreCountとThreadsPerCoreを指定する方法が一番簡単ですが、
ほかのやり方を調べたら、ConditionsセクションでvCPUを制限しEC2を作成することができたので、皆さんとシェアできると思います。

※本記事は重要な箇所のみご説明させていただきます。

まず、Mappingsセクションの定義です。ここでは各サーバーの差を一元管理します。

Mappings:
  WEB:
    EC2InstanceInfo:
      InstanceType: r5.xlarge
      CoreCount: "2"
      ThreadsPerCore: "1"
  DB:
    EC2InstanceInfo:
      InstanceType: r5.4xlarge
      CoreCount: ""
      ThreadsPerCore: ""

そして、Conditionsセクションの定義。ここではvCPUを制限するかどうか判定します。

Conditions:
  CoreCountFlg:
    !Not [!Equals [!FindInMap [!Ref Server, "EC2InstanceInfo", "CoreCount"], ""]]
  ThreadsPerCoreFlg:
    !Not [!Equals [!FindInMap [!Ref Server, "EC2InstanceInfo", "ThreadsPerCore"], ""]]
  IsLimitvCPU:
    !Or [Condition: CoreCountFlg, Condition: ThreadsPerCoreFlg]

CoreCountの値が定義しているかどうかという判定結果をCoreCountFlgに保存します。
ThreadsPerCoreの値が定義しているかどうかという判定結果をThreadsPerCoreFlgに保存します。
CoreCountFlgまたはThreadsPerCoreFlgが定義されている場合、IsLimitvCPUが「true」になります。
※実際にはCoreCountまたはThreadsPerCore片方定義するとCloudFormationでEC2を作成する時にエラーになります。

最後、ResourcesのEC2Instanceセクションの定義です。

Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !FindInMap [!Ref Server, "EC2InstanceInfo", "InstanceType"]
      CpuOptions: !If
        - IsLimitvCPU
        - CoreCount:  !FindInMap [!Ref Server, "EC2InstanceInfo", "CoreCount"]
          ThreadsPerCore:  !FindInMap [!Ref Server, "EC2InstanceInfo", "ThreadsPerCore"]
        - !Ref AWS::NoValue

InstanceTypeの値はMappingsセクションから作成するサーバーの指定により「r5.xlarge」や「r5.4xlarge」などをFindしてきて設定します。
CpuOptionsの値はまずIsLimitvCPUを判断します。
「true」の場合、MappingsセクションからCoreCountとThreadsPerCoreの値ををFindしてきて設定します。
「false」の場合、NoValueで設定します。NoValueの場合、例えばDBサーバーの作成で、CloudFormationは自動的にr5.4xlargeのデフォルトCoreCount数とThreadsPerCore数でEC2を作成します。

以上です。ご役に立てれば嬉しいです。

Last modified: 2023-06-30

Author