この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
現場では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を作成します。
以上です。ご役に立てれば嬉しいです。