Panduan Penerapan Kerangka Kerja untuk CI/CD untuk AWS Lambda Menggunakan Tindakan GitHub di Lingkungan LZA

1. Pendahuluan

Panduan ini menyajikan proses end-to-end lengkap untuk menyiapkan alur CI/CD untuk menerapkan fungsi AWS Lambda di beberapa akun AWS—khususnya Pengembangan dan Produksi—menggunakan GitHub Actions dan AWS CDK (TypeScript). Akun disediakan dan diatur melalui AWS Landing Zone Accelerator (LZA), yang memberlakukan lingkungan AWS multi-akun yang aman, dapat diskalakan, dan sesuai.

Isi artikel

Ikhtisar Arsitektur

  • Pengembang mendorong kode ke GitHub
  • Tindakan GitHub pipeline membangun dan menyebarkan ke Akun Pengembang
  • Fakultatif Persetujuan Manual langkah
  • Penerapan ke Akun Prod Setelah persetujuan

Teknologi Inti

2. Desain Unit Organisasi dengan LZA

AWS Landing Zone Accelerator menyediakan AWS Organisasi praktik terbaik yang terstandarisasi. OU yang direkomendasikan (Unit Organisasi):

  • Akar ATAU

Pemisahan ini menegakkan tata kelola yang kuat menggunakan Kebijakan Kontrol Layanan (SCP), penagihan terkonsolidasi, dan pagar pembatas otomatis.

3. Prasyarat

Akses yang Diperlukan

  • Hak istimewa admin di akun Dev dan Prod
  • Izin untuk mengonfigurasi Tindakan dan rahasia GitHub

Lingkungan Pembangunan Lokal

Instal alat yang diperlukan untuk menentukan infrastruktur dan menjalankan perintah CDK:

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

Penyiapan Repositori GitHub

Simpan rahasia berikut di repositori GitHub:

  • AWS_AKSES_KUNCI_ID_DEV
  • AWS_RAHASIA_AKSES_KUNCI_DEV
  • AWS_REKENING_ID_DEV
  • AWS_WILAYAH_DEV
  • AWS_AKSES_KUNCI_ID_MENJOLOK
  • AWS_RAHASIA_AKSES_KUNCI_MENJOLOK
  • AWS_REKENING_ID_MENJOLOK
  • AWS_WILAYAH_MENJOLOK

4. Penyiapan IAM dan CDK di AWS

Penyiapan Peran IAM

Setiap akun memerlukan peran IAM dengan kebijakan kepercayaan yang memungkinkan GitHub Actions untuk mengambilnya:

Kebijakan Kepercayaan:

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

Kebijakan Izin:

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

CDK Bootstrap

Jalankan bootstrap CDK di setiap akun untuk mempersiapkan penerapan:

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

Info lebih lanjut: Dokumentasi CDK Bootstrap

5. Pengaturan Proyek CDK

Inisialisasi Aplikasi CDK

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

Menginstal Perpustakaan CDK

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

Struktur Proyek

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

Kode 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!' })
  };
};        

Tumpukan 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. Pipeline CI/CD dengan Tindakan GitHub

Dokumentasi Tindakan GitHub

Gambaran Umum Alur Kerja

Pemicu: Dorong ke cabang utama

  1. Menginstal dependensi
  2. Bangun aplikasi
  3. Terapkan ke Dev
  4. Tunggu persetujuan manual
  5. Terapkan ke Prod

Alur Kerja Tindakan GitHub (.github/alur kerja/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. Penerapan dan Verifikasi

Memicu Alur

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

Validasi

  • Memantau alur kerja: UI Tindakan GitHub
  • Output AWS Console → CloudFormation → Stack
  • Titik akhir pengujian:

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

8. Pembersihan

Hancurkan Tumpukan

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

Menghapus Rahasia dan Peran IAM

  • Menghapus rahasia repositori GitHub
  • Menghapus pengguna atau peran IAM sementara

9. Rekomendasi Akhir

Solusi ini menggunakan alat DevOps modern untuk menyediakan alur CI/CD praktik terbaik dan siap produksi di seluruh lingkungan AWS.

Untuk melihat atau menambahkan komentar, silakan login

Artikel lain dari Suliman L.

Orang lain juga melihat