TerraformでLambdaに固定グローバルIPを振る

プログラミング

概要

今回は接続するサーバーや環境によって、グローバルIP制限が掛けられていることが多々あるかと思います。そのようなときにLambdaから固定IPを振る必要があるため、Terraformでどのようにresouceを作っていけばよいか解説します。

全体の構成としては以下のような形になり、VPC配下にパブリックサブネットとプライベートサブネットを作成します。その後パブリックサブネットのルートにはIGW(インターネットゲートウェイ)を入れ、プライベートサブネットのルートにNATゲートウェイを入れます。そしてNATゲートウェイにEIPを付与すればLambdaが固定IPでインターネットに出られるようになります。
※今回VPCはデフォルトで作成されているものを利用することとします。

EIPとIGWとNATゲートウェイの作成

まずEIPを作成します。適宜リソース名などは必要に応じて変更してください。

resource "aws_eip" "eip" {
  vpc = true

  tags = {
    Name = "EIP"
  }
}

続いてIGWを作成します。

resource "aws_internet_gateway" "gw" {
  vpc_id = "vpc-id" //利用するvpcのidを入力する

  tags = {
    Name = "gw"
  }
} 

続いてNATゲートウェイを作成します。subnet_idの部分は後ほどプライベートサブネットを作成します。

resource "aws_nat_gateway" "nat_gateway" {
  allocation_id     = aws_eip.eip.id
  subnet_id         = aws_subnet.private_subnet.id
  connectivity_type = "public"

  tags = {
    Name = "Nat Gateway"
  }
}

サブネットを作成する

まずパブリックサブネットを作成し、ルートテーブルにIGWを紐付けます。

resource "aws_subnet" "public_subnet" {
  availability_zone = "ap-northeast-1a"
  vpc_id            = "vpc-id" //利用するvpcのidを入力する
  cidr_block        = "172.31.16.0/20" // VPCのCidrによって変更してください

  tags = {
    Name = "Public Subnet"
  }
}

resource "aws_route_table" "public_subnet_route_table" {
  vpc_id = "vpc-id" //利用するvpcのidを入力する

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.gw.id
  }

  tags = {
    Name = " Public Subnet Route Table"
  }
}

resource "aws_route_table_association" "public_subnet_route_table_association" {
  subnet_id      = aws_subnet.public_subnet.id
  route_table_id = aws_route_table.public_subnet_route_table.id
}

続いてプライベートサブネットを作成し、NATゲートウェイをルートテーブルに入れます。

resource "aws_subnet" "private_subnet" {
  availability_zone = "ap-northeast-1a"
  vpc_id            = "vpc-id" //利用するvpcのidを入力する
  cidr_block        = "172.31.32.0/20" // VPCのCidrによって変更してください

  tags = {
    Name = "Private Subnet"
  }
}

resource "aws_route_table" "private_subnet_route_table" {
  vpc_id = "vpc-id" //利用するvpcのidを入力する

  route {
    cidr_block     = "0.0.0.0/0"
    nat_gateway_id = aws_nat_gateway.nat_gateway.id
  }

  tags = {
    Name = "Private Subnet Route Table"
  }
}

resource "aws_route_table_association" "private_subnet_route_table_association" {
  subnet_id      = aws_subnet.private_subnet.id
  route_table_id = aws_route_table.private_subnet_route_table.id
}

Lambdaへの紐付け

まずセキュリティグループを作成します。今回は全ての通信を許可しておきます。

resource "aws_security_group" "security_group" {
  name        = "SecurityGroup"
  description = " security group"
  vpc_id      = "vpc-id" //利用するvpcのidを入力する
  ingress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]

  }

  tags = {
    Name = " Security Group"
  }
}

そして最後にLambdaをプライベートサブネット内に配置します。aws_lambda_functionのresouce内に以下を記載してください。

  vpc_config {
    security_group_ids = [aws_security_group.security_group.id]
    subnet_ids         = [aws_subnet.private_subnet.id]
  }

終わりに

これでLambdaへ固定IPを振ることができたと思います。Terraformは日々アップデートが入り書き方が変わっていく可能性もあるので、上手く行かなかったら公式サイトを読んでみてください。

Terraform Registry

コメント