Menerapkan Aplikasi FastAPI ke ECS Fargate
Artikel ini akan memperkenalkan cara menerapkan aplikasi FastAPI ke ECS Fargate. Arsitektur dijelaskan dalam diagram berikut.
Anda dapat memeriksa kode sumber di repositori berikut.
Pengetahuan berikut diperlukan untuk memahami kode sumber:
- FastAPI
- Terraform
- GitHub Actions
- AWS
- Docker
Kloning Kode Sumber
Kloning kode sumber dilakukan dengan perintah berikut:
$ git clone https://github.com/ryuseikakujo/fastapi-on-fargate.git
Pengaturan
Lakukan langkah pengaturan berikut:
- Menyiapkan Variabel Lingkungan
- Membuat Repositori ECR
- Mengunggah Gambar Docker ke ECR
- Membuat Backend Terraform
- Membuat Resource Infrastruktur dengan Terraform
- Mengkonfigurasi Rahasia GitHub Actions
Menyiapkan Variabel Lingkungan
Atur variabel lingkungan dengan perintah berikut:
$ export AWS_PROFILE=xxxxx
$ export AWS_ACCOUNT_ID=xxxxx
Membuat Repositori ECR
Buat repositori ECR. Pada contoh di bawah, saya membuat repositori dengan nama my-app
.
$ cd infrastructure/provisioning
$ sh ecr.sh
Enter app name: my-app
The ECR repository namely my-app will be created.
Mengunggah Gambar Docker ke ECR
Unggah gambar Docker ke repositori ECR yang telah dibuat. Ketika diminta nama aplikasi, masukkan my-app
(nama repositori ECR Anda).
$ cd api
$ sh local-push-to-ecr.sh
Enter app name: my-app
Membuat Backend Terraform
Buat backend untuk mengelola state Terraform. Ini akan membuat S3 dan DynamoDB. Perhatikan bahwa ketika diminta untuk Enter unique S3 bucket name for Terraform Backend:
, Anda perlu memilih nama yang unik secara global. Misalnya, nama seperti my-app-tfstate
mungkin tidak unik.
$ cd infrastructure/provisioning
$ sh backend.sh
Enter unique S3 bucket name for Terraform Backend: my-app-tfstate
Enter dynamodb name for Terraform Backend: my-app-tfstate
Enter Cloudformation stack name for Terraform Backend: my-app-tfstate
Membuat Resource Infrastruktur dengan Terraform
Pertama, ubah bucket
dan dynamodb_table
dalam file infrastructure/terraform/backend.tf
.
backend "s3" {
- bucket = "my-app-tfstate" # This should be the name you defined at step 3.
+ bucket = "<Your s3 bucket name>" # This should be the name you defined at step 3.
key = "terraform.tfstate"
- dynamodb_table = "my-app-tfstate" # This should be the name you defined at step 3.
+ dynamodb_table = "<Your dynamodb table name>" # This should be the name you defined at step 3.
region = "ap-northeast-1"
}
Selanjutnya, ubah nfrastructure/terraform/variables.tf
.
variable "aws_account_id" {
- default = "123456789012"
+ default = "<Your account id>"
}
variable "app_name" {
type = string
- default = "my-app"
+ default = "<Your app name>"
}
variable "vpc_cidr" {
type = string
default = "10.0.0.0/16"
}
variable "azs" {
type = list(string)
default = ["ap-northeast-1a", "ap-northeast-1c"]
}
variable "public_subnet_cidrs" {
default = ["10.0.0.0/24", "10.0.1.0/24"]
}
variable "private_subnet_cidrs" {
default = ["10.0.10.0/24", "10.0.11.0/24"]
}
variable "github_org" {
- default = "my-org"
+ default = "<Your github organization name>"
}
variable "github_repo" {
- default = "my-repo"
+ default = "<Your github repository name>"
}
Selanjutnya, terapkan Terraform dengan perintah berikut:
$ cd infrastructure/terraform
$ terraform init
$ terraform apply
Resource berikut akan dibuat:
- VPC
- Subnet
- Internet Gateway
- NAT Gateway
- Grup Keamanan
- ECS
- Kluster
- Definisi Task
- Service
- Catatan Log CloudWatch ECS
- Role IAM
- Role untuk mengunggah gambar ke ECR melalui GitHub Actions dengan OIDC
- Role eksekusi task ECS
- ALB
- S3
- Bucket untuk mengumpulkan catatan log ALB
FastAPI akan berjalan di ECS Fargate di subnet privat, dan lalu lintas akan seimbang oleh ALB.
Mengkonfigurasi Rahasia GitHub Actions
Untuk melakukan pengiriman ECS dengan GitHub Actions yang didefinisikan dalam .github/workflows/cd_ecs.yml
, konfigurasikan Rahasia berikut di GitHub:
AWS_IAM_ROLE_ARN
: ARN dari role IAM untuk GitHub ActionsECR_REPO_NAME
: Nama repositori ECRTASK_DEFINITION_FAMILY_NAME
: Nama definisi task ECSECS_CLUSTER_NAME
: Nama kluster ECSECS_SERVICE_NAME
: Nama layanan ECS
Ketika terjadi perubahan pada cabang main
, GitHub Actions akan mengunggah gambar Docker ke ECR dan memperbarui definisi task ECS.
Referensi