Edited at

GitHub Actionsを使ってAWS Lambdaへ自動デプロイ (詳説+デモ手順付きver)


前置き

ソースコードの管理をGitHubで行なっているのでCI/CDもGitHubに統一できたら楽だな〜と思って、GitHub Actionsを色々検証したり、実際にステージング・本番環境へデプロイするのに使ったりしています。

そこで今回はAWS Lambdaへの自動デプロイ方法を説明したいと思います。

今回例として使用するデモアプリはこちらに置いてあります。


概要


  • CDにはタイトル通りGitHub Actionsを使用

  • デプロイにはServerless Frameworkを使う

  • ただデプロイするのは簡単なので、GitHubのSecretsからLambdaの環境変数に値をセット


GitHub Actionsとは


  • GitHubのリポジトリ上でビルド、テスト、デプロイなのでCI/CDを完結できる

  • CI/CDを実行する環境を選択できる

  • jobを並列実行可能 (制限はある)


Price


自動デプロイ方法


GitHub Actions

予めGitHubのSecretsに3つのパラメーターの設定が必要


  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • SLACK_WEBHOOK

これらが設定されていないと失敗するので注意が必要

わざと失敗させてみるのもいいですが...


イベントトリガー


.github/workflows/deploy.yml

on:

push:
branches:
- master

パラメーター
説明

on
イベントトリガー

branches
トリガーとなるbranchの制限


Workflow名


.github/workflows/deploy.yml

name: Auto Deploy to AWS Lambda




Job


.github/workflows/deploy.yml

jobs:

deploy:
name: Auto Deploy
runs-on: ubuntu-18.04
steps:

パラメーター
説明

name
jobの名前

runs-on
環境を設定(ubuntu, macos, windows)
サポートしているバージョン一覧

steps
実際の処理を定義


Steps

最新コミットにチェックアウト


.github/workflows/deploy.yml

- uses: actions/checkout@master


パラメーター
説明

uses
使用するactionを宣言
GitHub Actions Marketplace

Node.jsのセットアップ


.github/workflows/deploy.yml

- name: Setup Node.js

uses: actions/setup-node@v1
with:
node-version: '10.x'

パラメーター
説明

with
引数を渡す
何を引数として渡せるかは、actions/setup-nodeのaction定義ファイルに書かれている

依存パッケージのインストール


.github/workflows/deploy.yml

- name: Install Dependencies

run: |
npm install serverless -g
npm install

パラメーター
説明

run
コマンドの実行

Lambdaへデプロイ


.github/workflows/deploy.yml

- 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 }}

パラメーター
説明

env
環境変数の定義

Invoke Lambda


.github/workflows/deploy.yml

- 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 }}

jobの成否をSlackへ通知


.github/workflows/deploy.yml

- 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 }}

パラメーター
説明

if
jobの状態によって分岐できる

slackの通知例

何らかのjobが失敗した時にはサイドバーの色が緑色から赤色に変わる

リンクからGitHub Actionsの実行結果画面にとべるようになっているのですぐに原因を調べることができる


完成形


.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

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


正常に実行されれば以下のような通知がLambdaからSlackへとんでくる


本番運用のためのTips


  • Secretsはドキュメントに残すべし


    • 後からSecretsの中身は見れないので、忘れたらやばい :scream_cat:



  • 現段階ではキャッシュが使えないので、job間で極力依存関係をなくすようにする


Let’s Demo

デモ用のアプリはこちら


自動デプロイ


手順



  1. デモリポジトリのUse this templateからPrivateリポジトリを作成

  2. GitHubのSecretsにAWSの認証データとSlackのIncoming Webhooks URLをセット


  3. .github/workflows/deploy.ymlをアンコメント

  4. 必要に応じてserverless.ymlを編集

  5. git commit

  6. git push origin master

  7. GitHub Actionsが起動される

  8. デプロイされるまで待機 (暫しご歓談) 🗣️

  9. Slackに通知が来る


自動削除


手順



  1. github/workflows/remove.ymlをアンコメント

  2. git commit

  3. git push origin master:remove

  4. GitHub Actionsが起動される

  5. 削除されるまで待機 (暫しご歓談) 🗣️

  6. Slackに通知が来る


Appendix


Reference