Panduan Penerapan Kerangka Kerja untuk CI/CD untuk AWS Lambda Menggunakan Tindakan GitHub di Lingkungan LZA
1. Pendahuluan
Panduan ini menyajikan proses end-to-end lengkap untuk menyiapkan alur CI/CD untuk menerapkan fungsi AWS Lambda di beberapa akun AWS—khususnya Pengembangan dan Produksi—menggunakan GitHub Actions dan AWS CDK (TypeScript). Akun disediakan dan diatur melalui AWS Landing Zone Accelerator (LZA), yang memberlakukan lingkungan AWS multi-akun yang aman, dapat diskalakan, dan sesuai.
Ikhtisar Arsitektur
- Pengembang mendorong kode ke GitHub
- Tindakan GitHub pipeline membangun dan menyebarkan ke Akun Pengembang
- Fakultatif Persetujuan Manual langkah
- Penerapan ke Akun Prod Setelah persetujuan
Teknologi Inti
- Akselerator Zona Pendaratan AWS (LZA): Mengelola tata kelola multi-akun
- AWS CDK (TypeScript): Mendefinisikan arsitektur nirserver sebagai kode
- AWS Lambda + Gerbang API: Menghadirkan fungsionalitas cloud-native
- Tindakan GitHub: Menjalankan alur kerja penyebaran sebagai respons terhadap peristiwa repositori
2. Desain Unit Organisasi dengan LZA
AWS Landing Zone Accelerator menyediakan AWS Organisasi praktik terbaik yang terstandarisasi. OU yang direkomendasikan (Unit Organisasi):
- Akar ATAU
Pemisahan ini menegakkan tata kelola yang kuat menggunakan Kebijakan Kontrol Layanan (SCP), penagihan terkonsolidasi, dan pagar pembatas otomatis.
3. Prasyarat
Akses yang Diperlukan
- Hak istimewa admin di akun Dev dan Prod
- Izin untuk mengonfigurasi Tindakan dan rahasia GitHub
Lingkungan Pembangunan Lokal
Instal alat yang diperlukan untuk menentukan infrastruktur dan menjalankan perintah CDK:
brew install node awscli
npm install -g aws-cdk
aws configure
Penyiapan Repositori GitHub
Simpan rahasia berikut di repositori GitHub:
- AWS_AKSES_KUNCI_ID_DEV
- AWS_RAHASIA_AKSES_KUNCI_DEV
- AWS_REKENING_ID_DEV
- AWS_WILAYAH_DEV
- AWS_AKSES_KUNCI_ID_MENJOLOK
- AWS_RAHASIA_AKSES_KUNCI_MENJOLOK
- AWS_REKENING_ID_MENJOLOK
- AWS_WILAYAH_MENJOLOK
4. Penyiapan IAM dan CDK di AWS
Penyiapan Peran IAM
Setiap akun memerlukan peran IAM dengan kebijakan kepercayaan yang memungkinkan GitHub Actions untuk mengambilnya:
Kebijakan Kepercayaan:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
Kebijakan Izin:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"s3:*"
],
"Resource": "*"
}
]
}
CDK Bootstrap
Jalankan bootstrap CDK di setiap akun untuk mempersiapkan penerapan:
cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD
Info lebih lanjut: Dokumentasi CDK Bootstrap
Direkomendasikan oleh LinkedIn
5. Pengaturan Proyek CDK
Inisialisasi Aplikasi CDK
mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript
Menginstal Perpustakaan CDK
npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs
Struktur Proyek
.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml
Kode Lambda (lambda/handler.ts)
export const helloWorld = async () => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello World!' })
};
};
export const helloWorldKit = async () => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello from Kit!' })
};
};
Tumpukan CDK (lib/my-cdk-serverless-app-stack.ts)
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
export class MyCdkServerlessAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const helloWorldLambda = new lambda.NodejsFunction(this, 'HelloWorldFunction', {
entry: 'lambda/handler.ts',
handler: 'helloWorld'
});
const helloWorldKitLambda = new lambda.NodejsFunction(this, 'HelloWorldKitFunction', {
entry: 'lambda/handler.ts',
handler: 'helloWorldKit'
});
const api = new apigateway.RestApi(this, 'MyApi');
api.root.addResource('hello').addMethod('GET', new apigateway.LambdaIntegration(helloWorldLambda));
api.root.addResource('hellokit').addMethod('GET', new apigateway.LambdaIntegration(helloWorldKitLambda));
}
}
6. Pipeline CI/CD dengan Tindakan GitHub
Dokumentasi Tindakan GitHub
Gambaran Umum Alur Kerja
Pemicu: Dorong ke cabang utama
- Menginstal dependensi
- Bangun aplikasi
- Terapkan ke Dev
- Tunggu persetujuan manual
- Terapkan ke Prod
Alur Kerja Tindakan GitHub (.github/alur kerja/deploy.yml)
name: Deploy Lambda via CDK
on:
push:
branches: [main]
jobs:
deploy-dev:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci && npm run build
- uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_DEV }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEV }}
aws-region: ${{ secrets.AWS_REGION_DEV }}
- run: npx cdk deploy --require-approval never
deploy-prod:
needs: deploy-dev
runs-on: ubuntu-latest
environment:
name: production
steps:
- name: Await Approval
uses: hmarr/auto-approve-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci && npm run build
- uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_PROD }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_PROD }}
aws-region: ${{ secrets.AWS_REGION_PROD }}
- run: npx cdk deploy --require-approval never
7. Penerapan dan Verifikasi
Memicu Alur
git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline
Validasi
- Memantau alur kerja: UI Tindakan GitHub
- Output AWS Console → CloudFormation → Stack
- Titik akhir pengujian:
curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello
8. Pembersihan
Hancurkan Tumpukan
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy
Menghapus Rahasia dan Peran IAM
- Menghapus rahasia repositori GitHub
- Menghapus pengguna atau peran IAM sementara
9. Rekomendasi Akhir
- Menggunakan GitHub OIDC Federation untuk akses tanpa kredensial
- Perluas alur dengan pengujian unit, linting, logika rollback, atau penerapan kenari
- Pantau dengan Amazon CloudWatch dan AWS X-Ray
Solusi ini menggunakan alat DevOps modern untuk menyediakan alur CI/CD praktik terbaik dan siap produksi di seluruh lingkungan AWS.