Rangka Kerja untuk Panduan Penggunaan CI/CD untuk AWS Lambda Menggunakan Tindakan GitHub dalam Persekitaran LZA
1. Pengenalan
Panduan ini membentangkan proses hujung ke hujung yang lengkap untuk menyediakan saluran paip CI/CD untuk menggunakan fungsi AWS Lambda merentas berbilang akaun AWS—khususnya Pembangunan dan Pengeluaran—menggunakan GitHub Actions dan AWS CDK (Skrip Taip). Akaun diperuntukkan dan ditadbir melalui AWS Landing Zone Accelerator (LZA), yang menguatkuasakan persekitaran AWS berbilang akaun yang selamat, berskala dan mematuhi.
Gambaran Keseluruhan Senibina
- Pembangun menolak kod ke Github
- Tindakan GitHub saluran paip membina dan menggunakan ke Akaun Dev
- Pilihan Kelulusan Manual Langkah
- Penggunaan ke Akaun Prod selepas kelulusan
Teknologi Teras
- Pemecut Zon Pendaratan AWS (LZA): Menguruskan tadbir urus berbilang akaun
- AWS CDK (Skrip Taip): Mentakrifkan seni bina tanpa pelayan sebagai kod
- AWS Lambda + Gerbang API: Menyampaikan fungsi asli awan
- Tindakan GitHub: Melaksanakan aliran kerja penggunaan sebagai tindak balas kepada peristiwa repo
2. Reka Bentuk Unit Organisasi dengan LZA
Pemecut Zon Pendaratan AWS menyediakan Organisasi AWS amalan terbaik yang standard. OU yang disyorkan (Unit Organisasi):
- Akar ATAU
Pemisahan ini menguatkuasakan tadbir urus yang kukuh menggunakan Dasar Kawalan Perkhidmatan (SCP), pengebilan disatukan, dan pagar pengawal automatik.
3. Prasyarat
Akses yang Diperlukan
- Keistimewaan pentadbir dalam akaun Dev dan Prod
- Keizinan untuk mengkonfigurasi Tindakan dan rahsia GitHub
Persekitaran Pembangunan Tempatan
Pasang alat yang diperlukan untuk mentakrifkan infrastruktur dan menjalankan arahan CDK:
brew install node awscli
npm install -g aws-cdk
aws configure
Persediaan Repositori GitHub
Simpan rahsia berikut dalam repositori GitHub:
- AWS_AKSES_KEKUNCI_ID_DEV
- AWS_RAHSIA_AKSES_KEKUNCI_DEV
- AWS_AKAUN_ID_DEV
- AWS_RANTAU_DEV
- AWS_AKSES_KEKUNCI_ID_PROD
- AWS_RAHSIA_AKSES_KEKUNCI_PROD
- AWS_AKAUN_ID_PROD
- AWS_RANTAU_PROD
4. Persediaan IAM dan CDK dalam AWS
Persediaan Peranan IAM
Setiap akaun memerlukan peranan IAM dengan dasar amanah yang membolehkan GitHub Actions menganggapnya:
Dasar Amanah:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
Dasar Kebenaran:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"s3:*"
],
"Resource": "*"
}
]
}
CDK Bootstrap
Jalankan bootstrap CDK dalam setiap akaun untuk bersedia untuk penggunaan:
cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD
Maklumat lanjut: Dokumentasi Bootstrap CDK
Dicadangkan oleh LinkedIn
5. Persediaan Projek CDK
Mulakan Apl CDK
mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript
Pasang Perpustakaan CDK
npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs
Struktur Projek
.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml
Kod 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!' })
};
};
Timbunan 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. Saluran Paip CI/CD dengan Tindakan GitHub
Dokumentasi Tindakan GitHub
Gambaran Keseluruhan Aliran Kerja
Pencetus: Tekan ke cawangan utama
- Pasang kebergantungan
- Bina apl
- Gunakan ke Dev
- Tunggu kelulusan manual
- Gunakan ke Prod
Aliran Kerja Tindakan GitHub (.github/workflows/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. Penggunaan dan Pengesahan
Mencetuskan Saluran Paip
git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline
Pengesahan
- Pantau aliran kerja: UI Tindakan GitHub
- Konsol AWS → CloudFormation → Output Stack
- Titik akhir ujian:
curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello
8. Pembersihan
Musnahkan Timbunan
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy
Alih keluar Rahsia dan Peranan IAM
- Alih keluar rahsia repositori GitHub
- Padamkan pengguna atau peranan IAM sementara
9. Cadangan Akhir
- Gunakan Persekutuan OIDC GitHub untuk akses tanpa kelayakan
- Lanjutkan saluran paip dengan ujian unit, linting, logik rollback atau penggunaan kenari
- Pantau dengan Amazon CloudWatch dan AWS X-Ray
Penyelesaian ini menggunakan alatan DevOps moden untuk menyediakan saluran paip CI/CD amalan terbaik dan sedia pengeluaran merentas persekitaran AWS.