Rammeverk for CI/CD-distribusjonsveiledning for AWS Lambda ved bruk av GitHub-handlinger i et LZA-miljø

Denne artikkelen ble automatisk maskinoversatt fra engelsk og kan inneholde unøyaktigheter. Finn ut mer
Se opprinnelig

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.

Artikkelens innhold

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

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

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

  1. Installere avhengigheter
  2. Bygg app
  3. Distribuer til utvikler
  4. Vent på manuell godkjenning
  5. 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

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

Denne løsningen bruker moderne DevOps-verktøy for å gi en produksjonsklar CI/CD-pipeline med beste praksis på tvers av AWS-miljøer.

Logg på hvis du vil se eller legge til en kommentar

Flere artikler av Suliman L.

Andre så også på