Rangka Kerja untuk Panduan Penggunaan CI/CD untuk AWS Lambda Menggunakan Tindakan GitHub dalam Persekitaran LZA

Artikel ini diterjemahkan secara automatik oleh terjemahan mesin daripada bahasa Inggeris dan mungkin mengandungi ketidaktepatan. Ketahui lebih lanjut
Lihat asal

1. Pengenalan

Panduan ini membentangkan proses hujung ke hujung yang lengkap untuk menyediakan saluran paip CI/CD untuk menggunakan fungsi AWS Lambda merentas berbilang akaun AWS—khususnya Pembangunan dan Pengeluaran—menggunakan GitHub Actions dan AWS CDK (Skrip Taip). Akaun diperuntukkan dan ditadbir melalui AWS Landing Zone Accelerator (LZA), yang menguatkuasakan persekitaran AWS berbilang akaun yang selamat, berskala dan mematuhi.

Kandungan artikel

Gambaran Keseluruhan Senibina

  • Pembangun menolak kod ke Github
  • Tindakan GitHub saluran paip membina dan menggunakan ke Akaun Dev
  • Pilihan Kelulusan Manual Langkah
  • Penggunaan ke Akaun Prod selepas kelulusan

Teknologi Teras

2. Reka Bentuk Unit Organisasi dengan LZA

Pemecut Zon Pendaratan AWS menyediakan Organisasi AWS amalan terbaik yang standard. OU yang disyorkan (Unit Organisasi):

  • Akar ATAU

Pemisahan ini menguatkuasakan tadbir urus yang kukuh menggunakan Dasar Kawalan Perkhidmatan (SCP), pengebilan disatukan, dan pagar pengawal automatik.

3. Prasyarat

Akses yang Diperlukan

  • Keistimewaan pentadbir dalam akaun Dev dan Prod
  • Keizinan untuk mengkonfigurasi Tindakan dan rahsia GitHub

Persekitaran Pembangunan Tempatan

Pasang alat yang diperlukan untuk mentakrifkan infrastruktur dan menjalankan arahan CDK:

brew install node awscli
npm install -g aws-cdk
aws configure        

Persediaan Repositori GitHub

Simpan rahsia berikut dalam repositori GitHub:

  • AWS_AKSES_KEKUNCI_ID_DEV
  • AWS_RAHSIA_AKSES_KEKUNCI_DEV
  • AWS_AKAUN_ID_DEV
  • AWS_RANTAU_DEV
  • AWS_AKSES_KEKUNCI_ID_PROD
  • AWS_RAHSIA_AKSES_KEKUNCI_PROD
  • AWS_AKAUN_ID_PROD
  • AWS_RANTAU_PROD

4. Persediaan IAM dan CDK dalam AWS

Persediaan Peranan IAM

Setiap akaun memerlukan peranan IAM dengan dasar amanah yang membolehkan GitHub Actions menganggapnya:

Dasar Amanah:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::GITHUB_ACCOUNT_ID:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}        

Dasar Kebenaran:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:*",
        "lambda:*",
        "apigateway:*",
        "iam:PassRole",
        "s3:*"
      ],
      "Resource": "*"
    }
  ]
}        

CDK Bootstrap

Jalankan bootstrap CDK dalam setiap akaun untuk bersedia untuk penggunaan:

cdk bootstrap aws://$AWS_ACCOUNT_ID_DEV/$AWS_REGION_DEV
cdk bootstrap aws://$AWS_ACCOUNT_ID_PROD/$AWS_REGION_PROD        

Maklumat lanjut: Dokumentasi Bootstrap CDK

5. Persediaan Projek CDK

Mulakan Apl CDK

mkdir lambda-cicd && cd lambda-cicd
cdk init app --language typescript        

Pasang Perpustakaan CDK

npm install @aws-cdk/aws-lambda @aws-cdk/aws-apigateway @aws-cdk/aws-lambda-nodejs        

Struktur Projek

.
├── lambda/handler.ts
├── lib/my-cdk-serverless-app-stack.ts
├── bin/my-cdk-serverless-app.ts
├── .github/workflows/deploy.yml        

Kod Lambda (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!' })
  };
};        

Timbunan CDK (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. Saluran Paip CI/CD dengan Tindakan GitHub

Dokumentasi Tindakan GitHub

Gambaran Keseluruhan Aliran Kerja

Pencetus: Tekan ke cawangan utama

  1. Pasang kebergantungan
  2. Bina apl
  3. Gunakan ke Dev
  4. Tunggu kelulusan manual
  5. Gunakan ke Prod

Aliran Kerja Tindakan GitHub (.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. Penggunaan dan Pengesahan

Mencetuskan Saluran Paip

git checkout -b feature/update
# Make code changes
# Commit and push
# Merge into main to trigger pipeline        

Pengesahan

  • Pantau aliran kerja: UI Tindakan GitHub
  • Konsol AWS → CloudFormation → Output Stack
  • Titik akhir ujian:

curl https://<api-id>.execute-api.<region>.amazonaws.com/prod/hello        

8. Pembersihan

Musnahkan Timbunan

AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... npx cdk destroy        

Alih keluar Rahsia dan Peranan IAM

  • Alih keluar rahsia repositori GitHub
  • Padamkan pengguna atau peranan IAM sementara

9. Cadangan Akhir

Penyelesaian ini menggunakan alatan DevOps moden untuk menyediakan saluran paip CI/CD amalan terbaik dan sedia pengeluaran merentas persekitaran AWS.

Untuk melihat atau menambahkan komen, daftar masuk

Lagi artikel daripada Suliman L.

Orang lain turut melihat