はじめてのCircle CI:による AWS Lambda 関数のデプロイ
今日はCICDツールであるCircleCIを使って、AWS Lambda関数をDeployしてみます。
CircleCI とは
Sass型のCI/CDサービスで、クラウド上の実行環境が提供されそこでスクリプトを実行し、ビルドやデプロイを行います。環境変数でAWS Credentialの設定が可能となっており、実行させるビルド&デプロイスクリプトに直接Credentialを記載しなくてもAWS CLIコマンドのインストールや実行が可能となっています。
GitHub Actions との違い
CICDといえばGitHub Actionsを使うケースも多いですが、GitHub Actionsが2019年サービス提供開始であることに対して、CircleCIは2011年サービス提供開始と老舗の存在です。その分デプロイ環境の並列処理による大規模環境の高速な処理やパイプライン制御など機能が充実しているのが特徴のようです。
一方GitHub Actionsは当然ソースコード管理とシームレスに連携するという強みがあります。
今日はGitHub上で管理されているLambda関数のソースコードを、変更イベントをもとにCircleCIのパイプラインを起動しAWS上へのデプロイを行います。
さっそくやってみる
0. CircleCIのアカウント開設
無料プランがありますので、まずはアカウント開設を行います。登録
をクリックします。
その後メールアドレス登録などを求められますので指示に従って作業を行えばアカウントは開設されます。
1. Circle CI で Organizationの作成
ログインできたら最初に行うのはOrganizationの作成です。トップ画面でGet Started
をクリックします。
適当な名前を入れれば完了です。
2. AWS Credential の組み込み
いま作成した組織には、複数のプロジェクトを設定できます。そのプロジェクトの実行結果がPipelineとして管理されます。
最初は少し関係性がややこしいですが、やっていく間にすぐ慣れてくると思いますので作業を進めていきます。
Circle CIの環境変数は組織単位で設定され、組織に属するプロジェクトが呼び出せる、という構造です。
まずAWS IAMで以下のポリシーがアタッチされたIAMユーザーを作成し、シークレットキーを作成しておきます。
アクセスキー
とシークレットアクセスキー
を手元にメモしておきます。
次にCircleCIのOrganization Settings
をクリックします。
左ペインのContexts
をクリックします。
Create Context
をクリックします。
わかりやすい名前を付けてCreate Context
をクリックします。
先ほど作成されたContextをクリックします。Add Environment Variable
をクリックして以下3つの環境変数を設定します。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION
後ほど環境変数の呼び出しをスクリプトから行いますが、以下のような指定で呼び出しが可能です。
- run:
name: Deploy to Lambda
command: |
aws lambda update-function-code \
--function-name firstcci \
--zip-file fileb://function.zip \
--region ap-northeast-1
workflows:
deploy-workflow:
jobs:
- deploy:
context: aws-credentials
3. Projectの作成とGitHub 連携
次にProjectを作成し、GitHubと連携させます。
GitHubレポジトリはとてもシンプルでindex.mjs
のみが格納されています。
(以下サンプル:.circleci
はこの後の手順で自動作成されます)
export const handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda deployed by CircleCI!'),
};
return response;
};
Create Project
をクリックします。
左上をクリックします。
適当な名前を付けてNext
をクリックします。
次の画面ではPipelineを作成が促されます。適当な名前を付けてNext
をクリックします。
GitHubレポジトリを選択します。
ブラウザの別タブでGitHubの画面が起動しCircleCIとう名前のAppをインストールする許可を与えます。Save
をクリックします。
CircleCIの画面でGitHubレポジトリがクリックできるようになりますので、選択してNext
をクリックします。
次に画面では実行されるパイプラインを定義する設定ファイルを指定します。CircleBotというAIツールがGitHubレポジトリの中身を読み取ってアプリケーションを推察し自動でymlファイルを生成してくれるようですが、このテストで使っているものは簡単すぎるのでymlの自動生成はされませんでしたので後で手で差し替えます。
生成されたymlファイルが表示されていますが、前述の通り後で差し替えますので、気にせずNext
をクリックします。次に行うのはTrigger
の設定です。自動で先ほど連携したGitHubレポジトリにトリガーを作成してくれます。Next
をクリックします。
最後の確認画面でCommit config and run
をクリックします。
自動でパイプラインがデフォルトのHello World
コンフィグファイルをもとにワークフローを実行します。
# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/configuration-reference
version: 2.1
# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs
jobs:
say-hello:
# Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub.
# See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job
docker:
# Specify the version you desire here
# See: https://circleci.com/developer/images/image/cimg/base
- image: cimg/base:current
# Add steps to the job
# See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps
steps:
# Checkout the code as the first step.
- checkout
- run:
name: "Say hello"
command: "echo Hello, World!"
# Orchestrate jobs using workflows
# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows
workflows:
say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow.
# Inside the workflow, you define the jobs you want to run.
jobs:
- say-hello
GitHub上には以下の通りブランチができています。
また.circleci/config.yml
というファイルができているはずです。
4. Lambda関数の作成とDeploy
ではLambda関数をNodeで起動しておきます。関数名はfirstcci
とします。
次にGitHub上のconfig.yml
をいかに置き換えて保存します。直接ブラウザでGitHub上からコミットします。
version: 2.1
executors:
node-executor:
docker:
- image: circleci/node:14
working_directory: ~/repo
jobs:
deploy_lambda:
executor: node-executor
steps:
- checkout
- run:
name: Create Lambda ZIP
command: |
# Lambda用のコードをZIP圧縮
zip -r lambda.zip . # カレントディレクトリ(Lambda関数のコード)をZIP圧縮
- run:
name: Deploy Lambda function
command: |
# AWS CLIをインストール
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# AWS認証情報を環境変数から設定(Contextから引き出される)
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
export AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
# AWS CLIのページャーを無効化
export AWS_PAGER=""
# Lambdaのデプロイを実行
aws lambda update-function-code \
--function-name firstcci \
--zip-file fileb://lambda.zip
workflows:
version: 2
deploy:
jobs:
- deploy_lambda:
context:
- aws-credentials
しばらく待つと無事Pipelineが成功しLambda関数がDeployされます。
Discussion