Framework for CI/CD-Bereitstellungshandbuch für AWS Lambda mit GitHub Actions in einer LZA-Umgebung
1. Einleitung
In diesem Leitfaden wird ein vollständiger End-to-End-Prozess für die Einrichtung einer CI/CD-Pipeline zum Bereitstellen von AWS Lambda-Funktionen über mehrere AWS-Konten – insbesondere Entwicklung und Produktion – mithilfe von GitHub Actions und AWS CDK vorgestellt (Maschinenschrift). Die Konten werden über AWS Landing Zone Accelerator bereitgestellt und verwaltet (LZA), die sichere, skalierbare und konforme AWS-Umgebungen mit mehreren Konten durchsetzt.
Überblick über die Architektur
Kerntechnologien
- AWS Landing Zone Accelerator (LZA): Verwaltet Multi-Account-Governance
- AWS CDK (Maschinenschrift): Definiert die serverlose Architektur als Code
- AWS Lambda + API-Schnittstelle: Bietet Cloud-native Funktionalität
- GitHub-Aktionen: Führt Bereitstellungsworkflows als Reaktion auf Repositoryereignisse aus
2. Gestaltung von Organisationseinheiten mit LZA
AWS Landing Zone Accelerator bietet eine standardisierte AWS-Organisation mit bewährten Methoden. Empfohlene Organisationseinheiten (Organisationseinheiten):
- Wurzel ODER
Diese Trennung erzwingt eine starke Governance mit Richtlinien für die Dienstkontrolle (SCPs), konsolidierte Abrechnung und automatisierte Leitplanken.
3. Voraussetzungen
Erforderlicher Zugriff
- Administratorrechte in Dev- und Prod-Konten
- Berechtigungen zum Konfigurieren von GitHub Actions und Geheimnissen
Lokales Entwicklungsumfeld
Installieren Sie die Tools, die zum Definieren der Infrastruktur und zum Ausführen von CDK-Befehlen erforderlich sind:
brew install node awscli
npm install -g aws-cdk
aws configure
Einrichtung des GitHub-Repositorys
Speichern Sie die folgenden Geheimnisse im GitHub-Repository:
4. IAM- und CDK-Einrichtung in AWS
Einrichtung der IAM-Rolle
Jedes Konto erfordert eine IAM-Rolle mit einer Vertrauensrichtlinie, die es GitHub Actions ermöglicht, sie zu übernehmen:
Vertrauensrichtlinie:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
Richtlinie für Berechtigungen:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"s3:*"
],
"Resource": "*"
}
]
}
CDK Bootstrap
Führen Sie CDK bootstrap in jedem Konto aus, um Bereitstellungen vorzubereiten:
cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD
Weitere Informationen: CDK Bootstrap Dokumentation
Empfohlen von LinkedIn
5. CDK-Projekteinrichtung
Initialisieren der CDK-App
mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript
Installieren von CDK-Bibliotheken
npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs
Projektstruktur
.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml
Lambda-Code (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-Stapel (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 mit GitHub Actions
GitHub Actions-Dokumentation
Übersicht über den Workflow
Auslöser: Push zum Hauptzweig
- Abhängigkeiten installieren
- App erstellen
- Bereitstellen für die Entwicklung
- Warten auf manuelle Genehmigung
- Bereitstellen in Prod
GitHub Actions-Arbeitsablauf (.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. Bereitstellung und Verifizierung
Auslösen der Pipeline
git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline
Validierung
- Überwachen des Workflows: GitHub Actions-Benutzeroberfläche
- Ausgaben der AWS-Konsole → CloudFormation → Stack
- Endpunkte testen:
curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello
8. Aufräumen
Stapel zerstören
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy
Entfernen von Secrets und IAM-Rollen
- Entfernen von GitHub-Repositorygeheimnissen
- Löschen temporärer IAM-Benutzer oder -Rollen
9. Abschließende Empfehlungen
- Verwenden des GitHub OIDC-Verbunds für den Zugriff ohne Anmeldeinformationen
- Erweitern der Pipeline mit Komponententests, Linting, Rollback-Logik oder Canary-Bereitstellungen
- Überwachen mit Amazon CloudWatch und AWS X-Ray
Diese Lösung nutzt moderne DevOps-Tools, um eine produktionsbereite CI/CD-Pipeline mit bewährten Methoden für AWS-Umgebungen bereitzustellen.