Zenn
😸

はじめてのCircle CI:による AWS Lambda 関数のデプロイ

に公開
1

今日はCICDツールであるCircleCIを使って、AWS Lambda関数をDeployしてみます。

CircleCI とは

https://circleci.com/ja/
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のアカウント開設

無料プランがありますので、まずはアカウント開設を行います。
https://circleci.com/ja/
このサイトから画面右上の登録をクリックします。

その後メールアドレス登録などを求められますので指示に従って作業を行えばアカウントは開設されます。

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はこの後の手順で自動作成されます)
https://github.com/harunobukameda/firstcci/tree/circleci-project-setup

index.mjs
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上からコミットします。

config.yml
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されます。


1

Discussion

ログインするとコメントできます