継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

NAT Gateway の自動作成・削除を SSM オートメーションを使って回してみた

タダです.

ずっと起動しておく必要ないけど,特定の時間帯にだけ自動作成・削除される NAT Gateway が必要になり,SSM オートメーション を使ったパターンを考えてみたのでこの記事でどんなことをやったかを紹介します.

概要

SSM Automation の AWS-UpdateCloudFormationStack を使って NAT Gateway の自動作成と削除を定期実行しています.このオートーメーションでは自動で作成される Lambda が指定して CloudFormation テンプレートでスタックの更新をかけます.パラメーターとして3つの定義が必要です.

パラメーター名 備考欄
LambdaAssumeRole CloudFormation を実行するための Lambda 用 IAM ロール
StackNameOrId 更新をかける CloudFormation スタック名
TemplateUrl 自動作成と削除の S3 にアップロードしたテンプレートまでの URL

docs.aws.amazon.com

NAT Gateway の作成と削除のテンプレートを予め S3 にアップロードしておくのですが,以下のようなテンプレートをアップロードしてます.Conditions の中で作成と削除それぞれの処理を分岐しています.また,作成のテンプレートを使って NAT Gateway を作成しておきます.

作成用テンプレート

Parameters:
  CreateNatGateway:
    Description: Enable NAT Gateway.
    Type: String
    Default: true

Conditions:
  CreateNatGateway:
    !Equals [true, !Ref EnableNatGateway]

Resources:
  NatGatewayRoute:
    Type: AWS::EC2::Route
    Condition: EnableNatGateway
    Properties:
      RouteTableId: rtb-xxx
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref CreateNatGateway

  CreateNatGateway:
    Type: AWS::EC2::NatGateway
    Condition: EnableNatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayEIP.AllocationId
      SubnetId: subnet-xxx

  NatGatewayEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

削除用テンプレート

Parameters:
  CreateNatGateway:
    Description: Enable NAT Gateway.
    Type: String
    Default: false

Conditions:
  CreateNatGateway:
    !Equals [true, !Ref EnableNatGateway]

Resources:
  NatGatewayRoute:
    Type: AWS::EC2::Route
    Condition: EnableNatGateway
    Properties:
      RouteTableId: rtb-xxx
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref CreateNatGateway

  CreateNatGateway:
    Type: AWS::EC2::NatGateway
    Condition: EnableNatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayEIP.AllocationId
      SubnetId: subnet-xxx

  NatGatewayEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

そして,オートメーションの実行のロールと Lambda 用の IAM ロールも定義しておきます.オートメーションの実行のロールには SSM オートメーションの実行と Lambda を作成するための CloudFormation の権限を与えておき,Lambada の IAM ロールには CloudFormation の変更権限と NAT Gateway の作成と変更権限を与えておきます.

SSM オートメーションの定期実行設定

定期実行設定は CloudWatch Events で行い,作成と削除それぞれ作成します.これで定期的に実行され,事前に作ったスタック に対して更新がかかり,作成の時は NAT Gateway 作成とルートテーブルへの関連づけ処理が走り,削除の時は NAT Gateway 削除とルートテーブルから NAT Gateway の経路削除が走ります.なお,EIP は削除対象に入っていないようにしているので定期実行時には作成や削除されず元々確保した EIP を使えます.

f:id:sadayoshi_tada:20210206140833p:plain

まとめ

NAT Gateway の自動作成と削除を SSM オートメーションを使って実現したのでその設定内容をまとめました.Lambda を使ってこの辺を仕組み化することも考えたのですが,Lambda をメンテするよりも CloudFormation テンプレートを適宜使い分けて定期実行するように SSM オートメーションで定義するほうがメンテのコストは低いと思いこの手法を使いました.同じことをやりたいと思っている方の参考になれば幸いです!

関連記事

sadayoshi-tada.hatenablog.com