Ramverk för CI/CD-distributionsguide för AWS Lambda med GitHub Actions i en LZA-miljö

Den här artikeln har maskinöversatts automatiskt från engelska och kan innehålla felaktigheter. Läs mer
Se originalet

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

Artikelinnehåll

Översikt över arkitektur


Grundläggande teknologier

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

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

  1. Installera beroenden
  2. Skapa app
  3. Distribuera till utvecklare
  4. Vänta på manuellt godkännande
  5. 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

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

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.

Logga in om du vill visa eller skriva en kommentar

Fler artiklar av Suliman L.

Andra har även tittat på