前置き
ソースコードの管理を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の中身は見れないので、忘れたらやばい
- 現段階ではキャッシュが使えないので、job間で極力依存関係をなくすようにする
Let’s Demo
デモ用のアプリはこちら
自動デプロイ
手順
- デモリポジトリのUse this templateからPrivateリポジトリを作成
- GitHubのSecretsにAWSの認証データとSlackのIncoming Webhooks URLをセット
- .github/workflows/deploy.ymlをアンコメント
- 必要に応じてserverless.ymlを編集
- git commit
- git push origin master
- GitHub Actionsが起動される
- デプロイされるまで待機 (暫しご歓談) 🗣️
- Slackに通知が来る
自動削除
手順
- github/workflows/remove.ymlをアンコメント
- git commit
- git push origin master:remove
- GitHub Actionsが起動される
- 削除されるまで待機 (暫しご歓談) 🗣️
- Slackに通知が来る