Traffine I/O

Bahasa Indonesia

2023-07-15

Mendeploy Aplikasi FastAPI ke ECS Fargate

Menerapkan Aplikasi FastAPI ke ECS Fargate

Artikel ini akan memperkenalkan cara menerapkan aplikasi FastAPI ke ECS Fargate. Arsitektur dijelaskan dalam diagram berikut.

Fast API on ECS Fargate architecture

Anda dapat memeriksa kode sumber di repositori berikut.

https://github.com/ryuseikakujo/fastapi-on-fargate

Pengetahuan berikut diperlukan untuk memahami kode sumber:

  • FastAPI
  • Terraform
  • GitHub Actions
  • AWS
  • Docker

Kloning Kode Sumber

Kloning kode sumber dilakukan dengan perintah berikut:

bash
$ git clone https://github.com/ryuseikakujo/fastapi-on-fargate.git

Pengaturan

Lakukan langkah pengaturan berikut:

  1. Menyiapkan Variabel Lingkungan
  2. Membuat Repositori ECR
  3. Mengunggah Gambar Docker ke ECR
  4. Membuat Backend Terraform
  5. Membuat Resource Infrastruktur dengan Terraform
  6. Mengkonfigurasi Rahasia GitHub Actions

Menyiapkan Variabel Lingkungan

Atur variabel lingkungan dengan perintah berikut:

bash
$ 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.

bash
$ 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).

bash
$ 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.

bash
$ 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.

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.

infrastructure/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:

bash
$ 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 Actions
  • ECR_REPO_NAME: Nama repositori ECR
  • TASK_DEFINITION_FAMILY_NAME: Nama definisi task ECS
  • ECS_CLUSTER_NAME: Nama kluster ECS
  • ECS_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

https://towardsaws.com/deploy-scalable-docker-service-with-amazon-ecs-on-ec2-instances-510178097190
https://github.com/ryuseikakujo/fastapi-on-fargate

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!