Help us understand the problem. What is going on with this article?

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

homines22
Network programmingやインフラ(サーバー・ネットワーク)などに興味があります。 最近はAWSを使ってサービス開発しています。 よく使う言語はC / Python / TypeScriptです。
hands-lab
ハンズラボは小売業特化型ITソリューション企業です。数十万に及ぶ膨大な商品マスタを扱ってきた豊富なノウハウで、お客様の現場に最適なシステムを提案・開発します。 エンジニア募集中
https://www.hands-lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした