🥰

Lambda&NATGatewayの連携方法

2021/03/31に公開

参考

・VPC構築周りは以下辺りを参照
  →VPC内のLambdaからインターネットにアクセスする
  →【AWS/Lambda】lambdaに固定IPをつける/VPCに所属させる

本題

結論、Lambda関数内でNATGatewayの作成やルーティング、削除などを行う。

※ 例えば、NATGatewayの作成〜ルーティングの流れは以下となる。

python
[python]

…(インポートの省略)

# クライアントを作成
client = boto3.client('ec2')

# エラスティックIPとパブリックサブネットIDを元に、NATGatewayを作成
response = client.create_nat_gateway(AllocationId="eipalloc-37fc1a52",SubnetId="subnet-1a2b3c4d")

# レスポンスからナットゲートウェイIdを抽出
natgw_id = response['NatGateway']['NatGatewayId']

# サイダーブロック、ナットゲートウェイId、ルートテーブルIDを元に、
# ナットゲートウェイとルートテーブルをルーティング
client.create_route(DestinationCidrBlock = '0.0.0.0/0', NatGatewayId = natgw_id, RouteTableId = "rtb-22574640")
go
[go]

…(インポートの省略)

// クライアントを作成
client := ec2.New(session.New())

// エラスティックIPとパブリックサブネットIDを元に、NATGatewayを作成
createNatGatewayInput := &ec2.CreateNatGatewayInput{
    AllocationId: aws.String("eipalloc-37fc1a52"),
    SubnetId:     aws.String("subnet-1a2b3c4d"),
}
result, err := client.CreateNatGateway(createNatGatewayInput)

createRouteInput := &ec2.CreateRouteInput{
    DestinationCidrBlock: aws.String("0.0.0.0/0"),
    GateWayId:            aws.String(""),
    RouteTableId:         aws.String("rtb-22574640"),
}
// レスポンスからナットゲートウェイIdを抽出し、CreateRouteInputのGateWayIdにセット
createRouteInput.GateWayId := result.NatGatewayId

// サイダーブロック、ナットゲートウェイId、ルートテーブルIDを元に、
// ナットゲートウェイとルートテーブルをルーティング
client.create_route(createRouteInput)

各メソッドは公式APIリファレンスを参照
Boto3(for Python API Reference)
AWS SDK for Go API Reference

※作成したクライアントは、AWSリソースを操作する為のオブジェクトに過ぎない。(EC2インスタンスを新規作成しているわけではない)
※サブネットIDやルートテーブルIDなどは環境変数での保持も可能。

Discussion