GitHub Actions를 사용하여 AWS Lambda에 자동 배포

전치



소스 코드의 관리를 GitHub로 행하고 있으므로 CI/CD도 GitHub에 통일할 수 있으면 편하구나~라고 생각해, GitHub Actions를 여러가지 검증하거나, 실제로 스테이징·프로덕션 환경에 배치하는데 사용하기도 하고 있습니다.
그래서 이번에는 AWS Lambda에 자동 배포하는 방법을 설명하고 싶습니다.

개요



CD는 제목대로 GitHub Actions를 사용하고 배포에는 Serverless Framework을 사용합니다. 그냥 배포하기 쉽기 때문에 GitHub의 Secrets에서 Lambda의 환경 변수로 값을 설정합니다.
데모용 앱은 여기 에 놓여 있기 때문에 fork하여 GitHub의 Secrets에 AWS 인증 데이터와 Slack의 Incoming Webhooks URL을 설정하여 뭔가 편집하고 commit/push하면 자동 배포를 체험할 수 있도록 하고 있습니다. 배포에 성공하면 Lambda가 실행되어 Lambda에서 Slack에 알림이 가게 되어 있습니다.

자동 배포 방법



Serverless Framework



Slack Incoming Webhook URL은 호스트 환경 변수에서 가져옵니다.

serverless.yml
service: auto-deploy-lambda

provider:
  name: aws
  region: ap-northeast-1
  timeout: 120

  environment:
    SLACK_WEBHOOK: ${env:SLACK_WEBHOOK}

package:
  exclude:
    - Dockerfile
    - docker-compose.yml

functions:
  slack:
    handler: src/index.post
    description: "Post message to Slack"
    timeout: 60

GitHub Actions



리포지토리에 있는 정의 파일 .github/workflows/deploy.yml 는 모두 코멘트 아웃하고 있으므로, 데모를 할 때는 코멘트 하지 않고 실시해 주세요.
해야 할 일은 GitHub의 Secrets에 세 가지 매개 변수 설정이 있습니다. AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY , SLACK_WEBHOOK 입니다. 이것들이 설정되어 있지 않으면 실패하므로 주의가 필요합니다. 일부러 실패시켜 보는 것도 좋지만 ...

.github/workflows/deploy.yml
on:
  push:
    branches:
      - master

name: Auto Deploy to AWS Lambda

jobs:
  deploy:
    name: Auto Deploy
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@master

      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: '10.x'

      - name: Install Dependencies
        run: |
          npm install serverless -g
          npm install

      - name: Deploy to Lambda
        run: sls deploy
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

      - name: Execute Lambda
        run: sls invoke -f slack
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

      - name: Notify result to slack
        uses: homoluctus/slatify@master
        if: always()
        with:
          type: ${{ job.status }}
          job_name: '*Deploy Lambda*'
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

내용은 Serverless Framework를 사용하여 Lambda에 배포 한 후 함수를 실행합니다. 성공적으로 실행되면 다음과 같은 알림이 Lambda에서 Slack으로 날아갈 수 있습니다.



Job 결과



여러분이 즐겁게 하고 싶은 분들을 위해 GitHub Actions 자체의 Job 결과를 통지하는 job을 마지막에 추가하고 있습니다. name: Notify result to slack 로부터 아래의 부분이군요.
Job이 성공하면 ↓의 느낌의 통지가 Slack에 옵니다.



어떤 작업이 실패하면 사이드 바의 색상이 녹색에서 빨간색으로 바뀝니다. 링크에서 GitHub Actions의 실행 결과 화면에 녹음되어 있으므로 즉시 원인을 조사할 수 있습니다.

좋은 웹페이지 즐겨찾기