Rammeverk for CI/CD-distribusjonsveiledning for AWS Lambda ved bruk av GitHub-handlinger i et LZA-miljø
1. Innledning
Denne veiledningen presenterer en komplett ende-til-ende-prosess for å sette opp en CI/CD-pipeline for å distribuere AWS Lambda-funksjoner på tvers av flere AWS-kontoer – spesielt utvikling og produksjon – ved hjelp av GitHub Actions og AWS CDK (Typeskript). Kontoene klargjøres og styres gjennom AWS Landing Zone Accelerator (LZA), som håndhever sikre, skalerbare og kompatible AWS-miljøer med flere kontoer.
Oversikt over arkitektur
- Utviklere sender kode til GitHub
- GitHub-handlinger pipelinebygg og distribuerer til Dev-konto
- Valgfri Manuell godkjenning skritt
- Distribusjon til Prod-konto etter godkjenning
Kjerneteknologier
- AWS landingssone akselerator (LZA): Administrerer styring av flere kontoer
- AWS CDK (Typeskript): Definerer serverløs arkitektur som kode
- AWS Lambda + API-gateway: Leverer skybasert funksjonalitet
- GitHub-handlinger: Kjører distribusjonsarbeidsflyter som svar på repositoriehendelser
2. Organisasjonsenhetsdesign med LZA
AWS Landing Zone Accelerator gir en standardisert, beste praksis AWS-organisasjon. Anbefalte organisasjonsenheter (Organisasjonsenheter):
- Rot ELLER
Denne separasjonen håndhever sterk styring ved hjelp av Policyer for tjenestekontroll (SCP-er), konsolidert fakturering og automatiserte rekkverk.
3. Forutsetninger
Nødvendig tilgang
- Administratorrettigheter i utvikler- og produksjonskontoer
- Tillatelser til å konfigurere GitHub-handlinger og -hemmeligheter
Lokalt utviklingsmiljø
Installer verktøy som kreves for å definere infrastruktur og kjøre CDK-kommandoer:
brew install node awscli
npm install -g aws-cdk
aws configure
Oppsett av GitHub-depot
Lagre følgende hemmeligheter i GitHub-repositoriet:
- AWS_TILGANG_NØKKEL_ID_DEV
- AWS_HEMMELIGHET_TILGANG_NØKKEL_DEV
- AWS_KONTO_ID_DEV
- AWS_REGION_DEV
- AWS_TILGANG_NØKKEL_ID_STIKKE
- AWS_HEMMELIGHET_TILGANG_NØKKEL_STIKKE
- AWS_KONTO_ID_STIKKE
- AWS_REGION_STIKKE
4. IAM- og CDK-oppsett i AWS
Oppsett av IAM-rolle
Hver konto krever en IAM-rolle med en klareringspolicy som lar GitHub Actions anta den:
Retningslinjer for tillit:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
Retningslinjer for tillatelser:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"s3:*"
],
"Resource": "*"
}
]
}
CDK Bootstrap
Kjør CDK-oppstart i hver konto for å klargjøre for distribusjoner:
cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD
Mer informasjon: CDK Bootstrap-dokumentasjon
Anbefalt av LinkedIn
5. Oppsett av CDK-prosjekt
Initialiser CDK-appen
mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript
Installere CDK-biblioteker
npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs
Prosjektets struktur
.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml
Lambda-kode (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-stabel (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-handlinger
Dokumentasjon for GitHub-handlinger
Oversikt over arbeidsflyt
Utløser: Trykk til hovedgrenen
- Installere avhengigheter
- Bygg app
- Distribuer til utvikler
- Vent på manuell godkjenning
- Distribuer til Prod
Arbeidsflyt for GitHub-handlinger (.github/arbeidsflyter/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. Distribusjon og verifisering
Utløse rørledningen
git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline
Validering
- Overvåk arbeidsflyt: Brukergrensesnitt for GitHub-handlinger
- AWS-konsoll → CloudFormation → Stack-utganger
- Test endepunkter:
curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello
8. Opprydding
Ødelegg stabler
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy
Fjerne hemmeligheter og IAM-roller
- Fjern GitHub-depothemmeligheter
- Slette midlertidige IAM-brukere eller -roller
9. Avsluttende anbefalinger
- Bruk GitHub OIDC Federation for legitimasjonsfri tilgang
- Utvid datasamlebåndet med enhetstester, linting, tilbakerullingslogikk eller kanarifugldistribusjoner
- Overvåk med Amazon CloudWatch og AWS røntgen
Denne løsningen bruker moderne DevOps-verktøy for å gi en produksjonsklar CI/CD-pipeline med beste praksis på tvers av AWS-miljøer.