Standup Serverless Jenkins on Fargate with Terraform – Part 1: Networking

Summarize this content to 400 words in Persian Lang
ابتدا ایجاد کنید متغیرها.tf. این فایل به ما اجازه می دهد تا متغیرهای مورد نیاز خود را تعریف کنیم – یک بلوک VPC CIDR، زیرشبکه های خصوصی و زیرشبکه های عمومی.
variable “vpc_cidr_block” {
description = “CIDR of vpc”
type = string
}
variable “public_subnets” {
description = “Map of public subnets that should be created”
type = map(object({
cidr_block = string
availability_zone = string
}))
}
variable “private_subnets” {
description = “Map of private subnets that should be created”
type = map(object({
cidr_block = string
availability_zone = string
}))
}
variable “application_name” {
description = “Name of the application”
type = string
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در مرحله بعد، تعاریف متغیر را ارائه خواهیم داد terraform.tfvars.
vpc_cidr_block = “10.0.0.0/24”
public_subnets = {
subnet_1 = {
cidr_block = “10.0.0.0/26”
availability_zone = “us-east-1a”
}
subnet_2 = {
cidr_block = “10.0.0.64/26”
availability_zone = “us-east-1b”
}
}
private_subnets = {
subnet_1 = {
cidr_block = “10.0.0.128/26”
availability_zone = “us-east-1a”
}
subnet_2 = {
cidr_block = “10.0.0.192/26”
availability_zone = “us-east-1b”
}
}
application_name = “serverless-jenkins-on-ecs”
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اکنون، ایجاد کنید vpc.tf و ابتدا VPC را ایجاد کنید. یک AWS VPC (Virtual Private Cloud) یک شبکه مجازی است که به طور منطقی از سایر شبکههای مجازی در AWS Cloud جدا شده است و کنترل آدرسهای IP، زیرشبکهها، جدولهای مسیر و دروازههای شبکه را در اختیار شما قرار میدهد.
# VPC
resource “aws_vpc” “this” {
cidr_block = var.vpc_cidr_block
enable_dns_hostnames = true
tags = {
Name = var.application_name
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
زیرشبکه های عمومی ایجاد کنید چیزی که این زیرشبکه ها را عمومی می کند این است که مسیری به یک دروازه اینترنتی (IGW) خواهند داشت که به منابع درون زیرشبکه اجازه می دهد مستقیماً با اینترنت ارتباط برقرار کنند.
# Public Subnets
resource “aws_subnet” “public” {
for_each = var.public_subnets
vpc_id = aws_vpc.this.id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
map_public_ip_on_launch = true
tags = {
Name = format(“public-%s-%s”, var.application_name, each.value.availability_zone)
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
IGW را ایجاد کنید و آن را با VPC مرتبط کنید. بعداً در جدول مسیر خود به آن اشاره خواهیم کرد و به زیرشبکه های عمومی خود متصل خواهیم کرد.
# IGW
resource “aws_internet_gateway” “this” {
vpc_id = aws_vpc.this.id
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
یک جدول مسیر برای زیرشبکه عمومی خود ایجاد کنید و یک مسیر به ترافیک قیفی از طریق IGW اضافه کنید. پس از آن، ارتباط جدول مسیر را ایجاد کنید تا IGW با زیرشبکه های عمومی سیم کشی شود.
# Public Route Table
resource “aws_route_table” “public” {
vpc_id = aws_vpc.this.id
tags = {
Name = “public”
}
}
# Add IGW Route
resource “aws_route” “public” {
route_table_id = aws_route_table.public.id
destination_cidr_block = “0.0.0.0/0”
gateway_id = aws_internet_gateway.this.id
}
# Associate Route Table with Subnet
resource “aws_route_table_association” “public” {
for_each = aws_subnet.public
subnet_id = each.value.id
route_table_id = aws_route_table.public.id
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بعد، زیرشبکه های خصوصی را ایجاد کنید. همانطور که از نام آن پیداست، این زیرشبکه ها از دنیای خارج غیرقابل دسترسی هستند.
# Private Subnets
resource “aws_subnet” “private” {
for_each = var.private_subnets
vpc_id = aws_vpc.this.id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
tags = {
Name = format(“private-%s-%s”, var.application_name, each.value.availability_zone)
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
حالا بیایید یک IP الاستیک (EIP) و یک دروازه NAT ایجاد کنیم. ما به EIP نیاز داریم، زیرا AWS به عنوان بخشی از ایجاد NAT Gateway به یکی نیاز دارد. NAT Gateway ضروری است زیرا به این ترتیب زیرشبکه های خصوصی می توانند با شبکه ارتباط برقرار کنند. تصور کنید که RHEL EC2 دارید که باید بهروزرسانیهای yum را دریافت کنند. شما به یک NAT Gateway نیاز دارید.
# EIP for NAT Gateway
resource “aws_eip” “this” {
for_each = aws_subnet.private
}
# NAT Gateway
resource “aws_nat_gateway” “this” {
for_each = aws_subnet.private
subnet_id = aws_subnet.public[each.key].id
allocation_id = aws_eip.this[each.key].id
tags = {
Name = format(“private-%s-%s”, var.application_name, each.value.availability_zone)
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در مرحله بعد، جدول مسیر، مسیر ارتباط NAT Gateway به زیرشبکه های خصوصی و ارتباط جدول مسیر را ایجاد می کنیم.
# Private Route Table
resource “aws_route_table” “private” {
for_each = aws_subnet.private
vpc_id = aws_vpc.this.id
tags = {
Name = format(“private-%s-%s”, var.application_name, each.value.availability_zone)
}
}
# Add Route – Private Subnets to NAT Gateway
resource “aws_route” “private” {
for_each = aws_subnet.private
route_table_id = aws_route_table.private[each.key].id
destination_cidr_block = “0.0.0.0/0”
nat_gateway_id = aws_nat_gateway.this[each.key].id
}
# Associate Private RT with Private Subnets
resource “aws_route_table_association” “private” {
for_each = aws_subnet.private
subnet_id = each.value.id
route_table_id = aws_route_table.private[each.key].id
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
شما آماده اید. دستورات زیر را اجرا کنید.
# Initialize Terraform
terraform init
# Check and see what will be created
terraform plan
# Let’s do this!
terraform apply
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اکنون به کنسول AWS بروید و VPC را جستجو کنید. به سمت پایین به نقشه منبع VPC بروید. روی subnets next کلیک کنید.همچنین، جدول های مسیر، دروازه های اینترنتی، دروازه های NAT و IP های الاستیک خود را بررسی کنید.
فین
ابتدا ایجاد کنید متغیرها.tf. این فایل به ما اجازه می دهد تا متغیرهای مورد نیاز خود را تعریف کنیم – یک بلوک VPC CIDR، زیرشبکه های خصوصی و زیرشبکه های عمومی.
variable "vpc_cidr_block" {
description = "CIDR of vpc"
type = string
}
variable "public_subnets" {
description = "Map of public subnets that should be created"
type = map(object({
cidr_block = string
availability_zone = string
}))
}
variable "private_subnets" {
description = "Map of private subnets that should be created"
type = map(object({
cidr_block = string
availability_zone = string
}))
}
variable "application_name" {
description = "Name of the application"
type = string
}
در مرحله بعد، تعاریف متغیر را ارائه خواهیم داد terraform.tfvars.
vpc_cidr_block = "10.0.0.0/24"
public_subnets = {
subnet_1 = {
cidr_block = "10.0.0.0/26"
availability_zone = "us-east-1a"
}
subnet_2 = {
cidr_block = "10.0.0.64/26"
availability_zone = "us-east-1b"
}
}
private_subnets = {
subnet_1 = {
cidr_block = "10.0.0.128/26"
availability_zone = "us-east-1a"
}
subnet_2 = {
cidr_block = "10.0.0.192/26"
availability_zone = "us-east-1b"
}
}
application_name = "serverless-jenkins-on-ecs"
اکنون، ایجاد کنید vpc.tf و ابتدا VPC را ایجاد کنید. یک AWS VPC (Virtual Private Cloud) یک شبکه مجازی است که به طور منطقی از سایر شبکههای مجازی در AWS Cloud جدا شده است و کنترل آدرسهای IP، زیرشبکهها، جدولهای مسیر و دروازههای شبکه را در اختیار شما قرار میدهد.
# VPC
resource "aws_vpc" "this" {
cidr_block = var.vpc_cidr_block
enable_dns_hostnames = true
tags = {
Name = var.application_name
}
}
زیرشبکه های عمومی ایجاد کنید چیزی که این زیرشبکه ها را عمومی می کند این است که مسیری به یک دروازه اینترنتی (IGW) خواهند داشت که به منابع درون زیرشبکه اجازه می دهد مستقیماً با اینترنت ارتباط برقرار کنند.
# Public Subnets
resource "aws_subnet" "public" {
for_each = var.public_subnets
vpc_id = aws_vpc.this.id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
map_public_ip_on_launch = true
tags = {
Name = format("public-%s-%s", var.application_name, each.value.availability_zone)
}
}
IGW را ایجاد کنید و آن را با VPC مرتبط کنید. بعداً در جدول مسیر خود به آن اشاره خواهیم کرد و به زیرشبکه های عمومی خود متصل خواهیم کرد.
# IGW
resource "aws_internet_gateway" "this" {
vpc_id = aws_vpc.this.id
}
یک جدول مسیر برای زیرشبکه عمومی خود ایجاد کنید و یک مسیر به ترافیک قیفی از طریق IGW اضافه کنید. پس از آن، ارتباط جدول مسیر را ایجاد کنید تا IGW با زیرشبکه های عمومی سیم کشی شود.
# Public Route Table
resource "aws_route_table" "public" {
vpc_id = aws_vpc.this.id
tags = {
Name = "public"
}
}
# Add IGW Route
resource "aws_route" "public" {
route_table_id = aws_route_table.public.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.this.id
}
# Associate Route Table with Subnet
resource "aws_route_table_association" "public" {
for_each = aws_subnet.public
subnet_id = each.value.id
route_table_id = aws_route_table.public.id
}
بعد، زیرشبکه های خصوصی را ایجاد کنید. همانطور که از نام آن پیداست، این زیرشبکه ها از دنیای خارج غیرقابل دسترسی هستند.
# Private Subnets
resource "aws_subnet" "private" {
for_each = var.private_subnets
vpc_id = aws_vpc.this.id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
tags = {
Name = format("private-%s-%s", var.application_name, each.value.availability_zone)
}
}
حالا بیایید یک IP الاستیک (EIP) و یک دروازه NAT ایجاد کنیم. ما به EIP نیاز داریم، زیرا AWS به عنوان بخشی از ایجاد NAT Gateway به یکی نیاز دارد. NAT Gateway ضروری است زیرا به این ترتیب زیرشبکه های خصوصی می توانند با شبکه ارتباط برقرار کنند. تصور کنید که RHEL EC2 دارید که باید بهروزرسانیهای yum را دریافت کنند. شما به یک NAT Gateway نیاز دارید.
# EIP for NAT Gateway
resource "aws_eip" "this" {
for_each = aws_subnet.private
}
# NAT Gateway
resource "aws_nat_gateway" "this" {
for_each = aws_subnet.private
subnet_id = aws_subnet.public[each.key].id
allocation_id = aws_eip.this[each.key].id
tags = {
Name = format("private-%s-%s", var.application_name, each.value.availability_zone)
}
}
در مرحله بعد، جدول مسیر، مسیر ارتباط NAT Gateway به زیرشبکه های خصوصی و ارتباط جدول مسیر را ایجاد می کنیم.
# Private Route Table
resource "aws_route_table" "private" {
for_each = aws_subnet.private
vpc_id = aws_vpc.this.id
tags = {
Name = format("private-%s-%s", var.application_name, each.value.availability_zone)
}
}
# Add Route - Private Subnets to NAT Gateway
resource "aws_route" "private" {
for_each = aws_subnet.private
route_table_id = aws_route_table.private[each.key].id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.this[each.key].id
}
# Associate Private RT with Private Subnets
resource "aws_route_table_association" "private" {
for_each = aws_subnet.private
subnet_id = each.value.id
route_table_id = aws_route_table.private[each.key].id
}
شما آماده اید. دستورات زیر را اجرا کنید.
# Initialize Terraform
terraform init
# Check and see what will be created
terraform plan
# Let's do this!
terraform apply
اکنون به کنسول AWS بروید و VPC را جستجو کنید.
به سمت پایین به نقشه منبع VPC بروید.
روی subnets next کلیک کنید.
همچنین، جدول های مسیر، دروازه های اینترنتی، دروازه های NAT و IP های الاستیک خود را بررسی کنید.
فین