프로그래밍/aws

[AWS] Lambda vpc Nat gateway 설정 with Terraform

장경훈 2024. 6. 10. 11:28

Labmda 에 VPC를 연결하게 되면 기본적으로는 Internet에 접근할 수 없게 되어있다.

이것을 해결하기 위해 Nat gateway를 설정해서 이 문제를 해결할 수 있다.

가용성을 생각해서 만들기 위해 public subnet 2개, private subnet 2개를 할당하였다.

 

#Vpc.tf
#vpc 생성
resource "aws_vpc" "capstone_vpc" {
  cidr_block = "10.10.0.0/16"
  tags ={
    Name="capstone_vpc"
  }
}
#public subnet, private subnet 생성
resource "aws_subnet" "public_subnet_1a" {
    vpc_id     = aws_vpc.capstone_vpc.id
    cidr_block = "10.10.1.0/24"
    availability_zone = "ap-northeast-2a"
    tags = {
        Name = "public_subnet_a"
    }
}

resource "aws_subnet" "public_subnet_1b" {
    vpc_id     = aws_vpc.capstone_vpc.id
    cidr_block = "10.10.2.0/24"
    availability_zone = "ap-northeast-2b"
    tags = {
        Name = "public_subnet_b"
    }
}

# subnet (private)
resource "aws_subnet" "private_subnet_1a" {
    vpc_id     = aws_vpc.capstone_vpc.id
    cidr_block = "10.10.101.0/24"
    availability_zone = "ap-northeast-2c"
    tags = {
        Name = "private_subnet_a"
    }
}
resource "aws_subnet" "private_subnet_1b" {
    vpc_id     = aws_vpc.capstone_vpc.id
    cidr_block = "10.10.102.0/24"
    availability_zone = "ap-northeast-2d"
    tags = {
        Name = "private_subnet_b"
    }
}
# public subnet에 연결할 IG 생성
resource "aws_internet_gateway" "capstone_igw" {
  vpc_id = aws_vpc.capstone_vpc.id

  tags = {
    Name = "Capstone_IGW"
  }
}
# public subnet에 IG를 연결하기 위한 라우팅 테이블 생성
resource "aws_route_table" "capstone_public" {
  vpc_id = aws_vpc.capstone_vpc.id

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

  tags = {
    Name="capstone_public"
  }
}
#퍼블릭 서브넷 라우팅 테이블과 연결
resource "aws_route_table_association" "public-a" {
  subnet_id = aws_subnet.public_subnet_1a.id
  route_table_id = aws_route_table.capstone_public.id
}
resource "aws_route_table_association" "public-b" {
  subnet_id = aws_subnet.public_subnet_1b.id
  route_table_id = aws_route_table.capstone_public.id
}
# Nat Gateway를 위한 Elasic IP 생성
resource "aws_eip" "Capstone-nat-elp" {
  domain = "vpc"
}

# Nat gateway 생성
resource "aws_nat_gateway" "capstoon-nat" {
  allocation_id = aws_eip.Capstone-nat-elp.id
  subnet_id     = aws_subnet.public_subnet_1a.id
  connectivity_type = "public"
  tags = {
    Name = "gw NAT"
  }
  # To ensure proper ordering, it is recommended to add an explicit dependency
  # on the Internet Gateway for the VPC.
  depends_on = [aws_internet_gateway.capstone_igw]
}
# private subnet과 Nat gateway 연결을 위한 라우팅 테이블
resource "aws_route_table" "capstone_private" {
  vpc_id = aws_vpc.capstone_vpc.id

  route{
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_nat_gateway.capstoon-nat.id
  }
  tags = {
    Name="capstone_private"
  }
}
#private subnet 라우팅 테이블과 연결 
resource "aws_route_table_association" "private-a" {
  subnet_id = aws_subnet.private_subnet_1a.id
  route_table_id = aws_route_table.capstone_private.id
  depends_on = [ aws_nat_gateway.capstoon-nat ]
}
resource "aws_route_table_association" "private-b" {
  subnet_id = aws_subnet.private_subnet_1b.id
  route_table_id = aws_route_table.capstone_private.id
    depends_on = [ aws_nat_gateway.capstoon-nat ]
}

 

#람다 함수 생성[image 기반]
resource "aws_lambda_function" "crawling_lambda" {
  function_name = "crawling-server"
  role          = aws_iam_role.iam_for_lambda.arn
  image_uri     = ""
  architectures = ["x86_64"]
  package_type = "Image"
  memory_size = 1024
  timeout = 10
  #앞서 생성한 private subnet 연결 *반드시 private subnet이여함*
  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet_1a.id,aws_subnet.private_subnet_1b.id]
    security_group_ids = [aws_security_group.MSK_security.id]
  }
}

'프로그래밍 > aws' 카테고리의 다른 글

AWS Glue VS AWS Step Function  (0) 2024.11.07
[AWS] S3 Event -> SQS 사용방법  (0) 2023.11.02
[aws] 몇가지 기능 간단정리  (0) 2023.07.27