目次
はじめに
こんにちは、omkです。
さて、今回はちょっと小ネタ的なところになります。
CFnでEIPを設定するときに私は「AWS::EC2::EIP」のInstanceIdでEC2を指定するやり方を取っていたのですが、このやり方だと新規でEIPを作成してEC2に割り当てるので既存のEIPを設定することが出来ません。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html
キャッシュの問題で、先にCFnでEIPを作ってDNSに設定しておいて、後から別のスタックでEC2に割り当てる必要性が出たので別の方法を探したという経緯です。
あんまり記事が無いようでしたのでここでまとめておきます。
結論
「AWS::EC2::EIPAssociation」を使用します。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html
公式ドキュメントだとEIPの真下にありますね。今気づきました。
ドキュメントから構文を引用してきました。
Type: AWS::EC2::EIPAssociation
Properties:
AllocationId: String
EIP: String
InstanceId: String
NetworkInterfaceId: String
PrivateIpAddress: String
この「AllocationId」が対象のEIPのAllocationIdを指定する部分になります(EC2-VPCの場合)。
「AWS::EC2::EIP」のAllocationIdは「Fn::GetAtt」で取得できます。
つまり、先に「AWS::EC2::EIP」で割り当てなしのEIPを作っておいて「Fn::GetAtt」でAllocationIdを取得、「AWS::EC2::EIPAssociation」のAllocationIdに入力する、という流れになります。
今回の私のケースだと
①EIPを作成するテンプレート
②EIPをEC2に割り当てるテンプレート
が別になっているので①のテンプレートで以下のように割り当て無しのEIPを作り、AllocationIdを出力しておきます。
Resources:
myVPCWebEIP:
Type: AWS::EC2::EIP
Properties:
Domain: "vpc"
Outputs:
myEIP:
Value: !GetAtt myVPCWebEIP.AllocationId
Export:
Name: "EIP-AllocationId"
次に②のテンプレートで、以下のように割り当てます。
Resources:
(略)
myEIPAssociation:
Type: AWS::EC2::EIPAssociation
Properties:
AllocationId: !ImportValue EIP-AllocationId
InstanceId: !Ref myEC2InstanceWeb
myEC2InstanceWeb:
Type: AWS::EC2::Instance
(略)
これで既存のEIPをあとからEC2インスタンスに割り当てることが可能です。
まとめ
特にCFnは公式ドキュメントをきちんと読んだ方がいいのですが横着してまとめてみた系の記事ばかり探してしまいます。ということで自分でまとめておきました。
以上、お付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!