Serverless Frameworkをcircleciで自動デプロイさせる

Serverless Frameworkを使ってサーバレス環境を構築し、circleciでテスト、デプロイの自動化をしていきます。サンプルとしてLamda + APIGatewayのシンプルなサーバレス環境を構築します。Node.js、Serverless Frameworkはインストール済み、AWS CLIも設定済みという前提で進めていきます。ではいきましょう!

Serverless Framework側の構築
サービスの作成

severlessのプロジェクトを作成します。テンプレートとして今回はpython3を使います。他テンプレートがいい場合は公式ドキュメントを参照ください。

$ serverless create --template aws-python3 --path sls-circle-sample
severless.ymlの編集

今回はLamda + APIGatewayのシンプルな環境を構築します。オプションとしてstageを受け取って環境ごとにスタックを作成させます。

service: sls-circle-sample

provider: name: aws runtime: python3.7 region: ap-northeast-1 stage: ${self:custom.env} stackName: stack-${self:service}-${self:custom.env} apiName: api-${self:service}-${self:custom.env} timeout: 30

custom: env: ${opt:stage, 'dev'}

functions: mainfunction: handler: handler.hello name: function-${self:service}-${self:custom.env} events: - http: path: sample method: get integration: lambda-proxy cors: true

これでserverless側の設定は終わりです。この状態でsls deployをすればデプロイされますが、今回はこれを自動化していきます。

テストコードの作成

circleci側の設定をする前にちゃちゃっとテストコードを書いておきます。testsディレクトリを作成して、その中にテストコードを書いていきます。

import unittest

import handler

class TestHandler(unittest.TestCase): def test_hello(self): event = {} result = handler.hello(event, None) self.assertEqual(result['statusCode'], 200)

testsディレクトリ内のテストコードを全て実行させるコマンドを打つため、__init__.pyも作成しておいてください。

circleciの設定

severless.ymlでstageごとにスタックを分けるようにしました。今回のcircleci側の設定として、developブランチの場合はdevという環境を、masterブランチの場合はprodという環境を作るようにしました。

version: 2.1

orbs: aws-cli: circleci/aws-cli@1.3.0 serverless: circleci/serverless-framework@1.0.1

workflows: version: 2 test-and-deploy: jobs: - test - deploy: requires: - test

jobs: test: docker: - image: circleci/python:3.7.8 steps: - checkout - restore_cache: key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }} - run: name: install dependencies command: | python3 -m venv venv . venv/bin/activate pip install -r requirements.txt - save_cache: key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }} paths: - "venv" - run: command: | . venv/bin/activate python -m unittest discover -p 'test_*.py' -v deploy: executor: serverless/default steps: - checkout - aws-cli/setup - serverless/setup - run: command: | if [[ "${CIRCLE_BRANCH}" == "develop" ]]; then serverless deploy --stage dev -v fi if [[ "${CIRCLE_BRANCH}" == "master" ]]; then serverless deploy --stage prod -v fi

requirements.txtの中身をインストールさせようとしていますが、今回はインストール不要なので空ファイルです。
orbsとしてcircleci/aws-clicircleci/serverless-frameworkを使用しました。1行でセットアップしてくれるので大変便利です。アクセスキーなどの接続情報をcircleciの画面から環境変数で定義しておけば自動で読み取ってくれます。詳しくは公式ドキュメントを参照ください。

さいごに

ファイル構成としてはこんな感じです。

.
├── .circleci
│   └── config.yml
├── handler.py
├── requirements.txt
├── serverless.yml
└── tests
    ├── init.py
    └── test_handler.py
githubにあげてcircleciと連携させたら完了です。githubにpushした時点でテスト&デプロイ処理が走ります。楽ちんですね。ではまた!