Ramverk för CI/CD-distributionsguide för AWS Lambda med GitHub Actions i en LZA-miljö
1. Inledning
Den här guiden presenterar en komplett process från slutpunkt till slutpunkt för att konfigurera en CI/CD-pipeline för att distribuera AWS Lambda-funktioner över flera AWS-konton – särskilt utveckling och produktion – med hjälp av GitHub Actions och AWS CDK (Maskin). Kontona etableras och styrs via AWS Landing Zone Accelerator (LZA
Översikt över arkitektur
Grundläggande teknologier
- Accelerator för AWS-landningszon (LZA (LZA)): Hanterar styrning med flera konton
- AWS CDK (Maskin): Definierar serverlös arkitektur som kod
- AWS Lambda + API-gateway: Levererar molnbaserad funktionalitet
- GitHub-åtgärder: Kör distributionsarbetsflöden som svar på lagringsplatsens händelser
2. Organisatorisk enhetsdesign med LZA
AWS Landing Zone Accelerator etablerar en standardiserad AWS-organisation med bästa praxis. Rekommenderade organisationsenheter (Organisatoriska enheter):
- Rot ELLER
Den här uppdelningen tvingar fram en stark styrning med hjälp av Principer för tjänstkontroll (Stabilitets- och konvergensprogram), konsoliderad fakturering och automatiserade skyddsräcken.
3. Förutsättningar
Åtkomst som krävs
- Administratörsbehörigheter i Dev- och Prod-konton
- Behörigheter för att konfigurera GitHub Actions och hemligheter
Lokal utvecklingsmiljö
Installera verktyg som krävs för att definiera infrastruktur och köra CDK-kommandon:
brew install node awscli
npm install -g aws-cdk
aws configure
Konfiguration av GitHub-lagringsplats
Lagra följande hemligheter på GitHub-lagringsplatsen:
4. IAM- och CDK-installation i AWS
Inställning av IAM-roll
Varje konto kräver en IAM-roll med en förtroendeprincip som gör att GitHub Actions kan anta den:
Policy för förtroende:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
Policy för behörigheter:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"s3:*"
],
"Resource": "*"
}
]
}
CDK Bootstrap
Kör CDK bootstrap i varje konto för att förbereda för distributioner:
cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD
Mer information: CDK Bootstrap-dokumentation
Rekommenderas av LinkedIn
5. Inställning av CDK-projekt
Initiera CDK-appen
mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript
Installera CDK-bibliotek
npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs
Projektets struktur
.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml
Lambda-kod (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!' })
};
};
CDK-stack (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. CI/CD-pipeline med GitHub Actions
Dokumentation om GitHub Actions
Översikt över arbetsflöde
Utlösare: Push-överför till huvudgrenen
- Installera beroenden
- Skapa app
- Distribuera till utvecklare
- Vänta på manuellt godkännande
- Distribuera till prod
Arbetsflöde för GitHub Actions (.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. Distribution och verifiering
Utlösa pipelinen
git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline
Validering
- Övervaka arbetsflöde: GitHub Actions användargränssnitt
- AWS-konsol → CloudFormation- → Stack-utdata
- Effektmått för test:
curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello
8. Städning
Förstör travar
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy
Ta bort hemligheter och IAM-roller
- Ta bort hemligheter för GitHub-lagringsplatsen
- Ta bort tillfälliga IAM-användare eller roller
9. Slutliga rekommendationer
- Använda GitHub OIDC Federation för åtkomst utan autentiseringsuppgifter
- Utöka pipelinen med enhetstester, linting, återställningslogik eller kanariedistributioner
- Bildskärm med Amazon CloudWatch och AWS X-Ray
Den här lösningen använder moderna DevOps-verktyg för att tillhandahålla en bästa praxis, produktionsklar CI/CD-pipeline i AWS-miljöer.