Framework for CI/CD-Bereitstellungshandbuch für AWS Lambda mit GitHub Actions in einer LZA-Umgebung

Dieser Artikel wurde automatisch maschinell aus dem Englischen übersetzt und kann Ungenauigkeiten enthalten. Mehr erfahren
Original anzeigen

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.

Artikelinhalte

Überblick über die Architektur


Kerntechnologien

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

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

  1. Abhängigkeiten installieren
  2. App erstellen
  3. Bereitstellen für die Entwicklung
  4. Warten auf manuelle Genehmigung
  5. 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

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

Diese Lösung nutzt moderne DevOps-Tools, um eine produktionsbereite CI/CD-Pipeline mit bewährten Methoden für AWS-Umgebungen bereitzustellen.

Zum Anzeigen oder Hinzufügen von Kommentaren einloggen

Weitere Artikel von Suliman L.

Ebenfalls angesehen