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これでserverless側の設定は終わりです。この状態でsls deployをすればデプロイされますが、今回はこれを自動化していきます。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
テストコードの作成
circleci側の設定をする前にちゃちゃっとテストコードを書いておきます。testsディレクトリを作成して、その中にテストコードを書いていきます。
import unittesttestsディレクトリ内のテストコードを全て実行させるコマンドを打つため、__init__.pyも作成しておいてください。import handler
class TestHandler(unittest.TestCase): def test_hello(self): event = {} result = handler.hello(event, None) self.assertEqual(result['statusCode'], 200)
circleciの設定
severless.ymlでstageごとにスタックを分けるようにしました。今回のcircleci側の設定として、developブランチの場合はdevという環境を、masterブランチの場合はprodという環境を作るようにしました。
version: 2.1requirements.txtの中身をインストールさせようとしていますが、今回はインストール不要なので空ファイルです。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
orbsとしてcircleci/aws-cliとcircleci/serverless-frameworkを使用しました。1行でセットアップしてくれるので大変便利です。アクセスキーなどの接続情報をcircleciの画面から環境変数で定義しておけば自動で読み取ってくれます。詳しくは公式ドキュメントを参照ください。
さいごに
ファイル構成としてはこんな感じです。
. ├── .circleci │ └── config.yml ├── handler.py ├── requirements.txt ├── serverless.yml └── tests ├── init.py └── test_handler.pygithubにあげてcircleciと連携させたら完了です。githubにpushした時点でテスト&デプロイ処理が走ります。楽ちんですね。ではまた!