AWS-CloudFormation

CloudFormationで既存EIPをEC2に割り当てる

はじめに

こんにちは、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は公式ドキュメントをきちんと読んだ方がいいのですが横着してまとめてみた系の記事ばかり探してしまいます。ということで自分でまとめておきました。
以上、お付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA