4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS LambdaとServerless #2Advent Calendar 2019

Day 16

CircleCIを利用してAWS SAMで自動デプロイする(Python)

Last updated at Posted at 2019-12-15

概要

AWS SAM + Pythonで開発したサーバーレスアプリケーションをCircleCIからデプロイする機会があったので、解説したいと思います。

下記の記事を参考にさせて頂きましたが、今回の設定では一部修正しないとうまく動作しない部分がありましたので、その点について記載したいと思います。
CircleCI と GitHub で AWS SAM のサーバーレスアプリを自動デプロイしてみた (開発環境 & 本番環境) | Developers.IO

Pythonでの経験が少ないため、間違った記載がありましたらご指摘いただけると嬉しいです🙇‍♀️
普段はAWS SAM + Goを利用することが多いです。

ソースコード

解説

CircleCIの設定ファイルはこんな感じで作成しました。

実行タイプにmachine(VM)を選択し、pipenvを利用した仮装環境でビルドとデプロイを行なっています。

.circleci/config.yml
deploy_template: &deploy_template
  machine: true
  working_directory: ~/project/app
  steps:
    - checkout
    - run:
        name: install python 3.6.0
        command: |
          pyenv install 3.6.0
          pyenv global 3.6.0
    - run:
        name: sam build
        command: |
          pip install pipenv
          python -m venv venv
          source venv/bin/activate

          pipenv install

          make build
    - run:
        name: deploy AWS Key
        command: |
          source venv/bin/activate

          make package
          make deploy

version: 2.1

jobs:
  deploy-dev:
    <<: *deploy_template
  deploy-prd:
    <<: *deploy_template

workflows:
  version: 2.1
  aws-sam-deploy:
    jobs:
      - deploy-dev:
          context: aws-dev
          filters:
            branches:
              only:
                - /develop/
      - deploy-prd:
          context: aws-prd
          filters:
            branches:
              only: /master/

Python仮装環境の構築

pipenvを利用して仮装環境を構築します。

pipenvについては下記の記事が参考になりましたので、掲載させて頂きます。
Pipenvを使ったPython開発まとめ

仮装環境にAWS CLIとAWS SAM CLIを追加します。
CircleCIでもこの仮装環境を利用してAWS SAMのビルドとデプロイを行います。

$ pipenv install awscli
$ pipenv install aws-sam-cli

ビルド

sam buildコマンドを利用して、ビルドを行います。
sam build - AWS Serverless Application Model

sam build --template template.yaml --use-container

今回は、オプションに--use-containerを指定します。
このオプションを指定することで、Lambdaの動作環境と同等のコンテナ内でビルドすることができます。

サンプルのソースコードには追加していませんが、Curatorを利用する際に--use-containerオプションを追加しなかった場合、ビルドでエラーとなりました。

AWS SAM CLI、SAM ビルドコマンドを導入

関数がネイティブでコンパイルされたプログラムを持つパッケージに依存している場合は、SAM ビルドコマンドに --use-container フラグを指定することもできます。この --use-container フラグは、Lambda のような環境でローカルに関数をコンパイルするので、それらをクラウドにデプロイするときには正しいフォーマットになります。

パッケージ&デプロイ

sam packagesam deployコマンドを利用してデプロイを行います。
AWS SAMをデプロイするためには、事前にS3バケットを用意しておく必要があります。

CircleCIの設定ファイル

ポイントは、下記の2点です。

  • 実行タイプにmachine(VM)を選択
  • コンテキストの使用して複数のAWSアカウントにデプロイを行う

詳細はconfig.ymlをご確認ください。

実行タイプにmachine(VM)を選択

sam build--use-containerオプションを追加しているため、コンテナ内でビルドが実行されます。

実行タイプにDockerを指定し、setup_remote_dockerを設定することで、CircleCIでコンテナを使用することができると思ったのですが、ファイルをマウントすることができずにビルドが失敗してしまいました。そのため、machineを指定しています。

参考:Docker コマンドの実行手順 - CircleCI

複数のAWSアカウントにデプロイを行う

開発環境を本番環境でAWSアカウントを分けているケースが多いと思います。
今回はCircleCIのContexts機能を利用することで、両方のアカウントにデプロイできるように設定を行なっています。

こちらの記事を参考にさせて頂きました。
CircleCIで複数のAWSアカウントを扱う方法

参考記事

CircleCI と GitHub で AWS SAM のサーバーレスアプリを自動デプロイしてみた (開発環境 & 本番環境) | Developers.IO
Pipenvを使ったPython開発まとめ
CircleCIで複数のAWSアカウントを扱う方法

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?