コンテンツにスキップ

cd_pipeline_lambda_trigger pattern

概要

cd_pipeline_lambda_trigger patternモジュールでは、Lambda関数をRuntime環境にデプロイするためのトリガとなるリソースを構築します。

本パターンとcd_pipeline_lambda patternとを連携させることで、Runtime環境に対してLambda関数を継続的にデプロイする環境が構築されます。

本パターンで構築される構成は以下のようになっています。

アーキテクチャ

想定する適用対象環境

cd_pipeline_lambda_trigger patternは、Delivery環境で使用することを想定しています。

依存するpattern

cd_pipeline_lambda_trigger patternは、事前に以下のpatternが適用されていることを前提としています。

pattern名 利用する情報
ci_pipeline pattern Lambda関数のソース(zip)およびデプロイのための設定ファイルが圧縮されたzipファイルを格納するS3バケット情報
audit pattern S3バケットへのオブジェクト配置のイベント検知

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
Amazon CloudWatch Events デプロイ実行のトリガとなるイベントを発生させるルールを定義します
Amazon EventBridge 異なるAWSアカウント間でイベントを伝搬させるための経路(イベントバス)を構築します

モジュールの理解に向けて

cd_pipeline_lambda_trigger patternが実現するフロー

本パターンではcd_pipeline_lambda patternで構築されるAWS CodePipelineに対して、デプロイをトリガするためのイベント1を構築します。

デプロイに利用されるイベントとしては、以下のようなイベントがあります。

  • Delivery環境のLambda関数デプロイのための資材を格納するS3バケットへ対象のオブジェクトをアップロード

⚠️ Lambda関数デプロイのための資材は、zipファイルとしてまとめ、S3バケットにアップロードしてください。

このイベントは、Amazon CloudWatchのEventBusを通じてRuntimeアカウントに送信され、Runtime環境で定義されたデプロイのためのパイプライン実行をトリガします。


ℹ️

上述のデプロイに利用されるイベントを捕捉する際、CloudTrailの S3のデータイベントログ記録機能を利用しています。

audit patternを用いてCloudTrailを構成している場合、当該機能を有効化する方法についてはaudit patternのドキュメントを参照してください。 Eponaを用いずにCloudTrailを構成している場合は、証跡データイベントのログ記録を ご参照ください。


デリバリシステムとの分離

上図の通りEponaでは、デリバリシステムをRuntime環境に配置し、S3バケットを配置するDelivery環境とは環境が分離されています。
この理由は、以下の2点です。

  1. 実質的なデプロイ処理2をRuntime環境で完結できる
  2. テスト済の同一のLambda関数を全てのRuntime環境上にデプロイすることを保証できる

アプリケーションのデプロイはエンドユーザーにも大きな影響を及ぼし得るため、適切な権限管理の元で実行する必要があります。
実質的なデプロイ処理をRuntime環境で完結させることができれば権限管理をシンプルにでき、意図しない、あるいは不適切なデプロイを防止できます。
このためデプロイ処理を担うCodePipelineをS3バケットと同じDelivery環境ではなく、Runtime環境に配置するアーキテクチャとしました。

一方でデプロイされるLambda関数については、テスト済のファイルを各Runtine環境にデプロイできることが安全です。
このため、Lambda関数のソースファイルやデプロイのための設定ファイルを格納するS3バケットはDelivery環境に配置し、バケットでファイルを一元管理するようにしています。

よりスムーズなデプロイメントパイプラインの実現に向けて

本パターンの前提であるci_pipeline patternでは、CIパイプラインの他にデプロイ対象のファイルを格納するS3バケットを構築しています。 本パターンを適用することで、上記のS3バケットに格納されたLambda関数を、Runtime環境へデプロイする処理が開始されるようになります。

ci_pipeline patternで構築されるCIパイプラインに対して以下の仕組みを組み込めば、ソース・設定ファイルを修正するだけでRuntime環境にデプロイできる仕組みを構築できます。CodeBuild、CodeDeployで使用する設定ファイルについてはcd_pipeline_lambda_patternで説明しています。

  • ソースが修正されたら、実行に必要となる資材とともにzip化して、S3バケットにアップロードする

これらの仕組みは ci_pipeline pattern で記載の通り、.gitlab-ci.yml に記述できます。

サンプルコード

cd_pipeline_lambda_trigger patternを使用したサンプルコードを、以下に記載します。

locals {
  runtime_account_id = "[Runtime環境のアカウントID]"
}

data "aws_region" "current" {}

module "cd_pipeline_lambda_trigger" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/cd_pipeline_lambda_trigger?ref=v0.2.6"

  pipeline_name      = "my-lambda-cd-pipeline"
  source_bucket_arn  = "arn:aws:s3:::lambda-static-resource"
  runtime_account_id = local.runtime_account_id

  # Runtime環境に構築するアーティファクトストアのバケット名
  artifact_store_bucket_arn = "arn:aws:s3:::yoshiki-artifacts"
  target_event_bus_arn      = "arn:aws:events:${data.aws_region.current.name}:${local.runtime_account_id}:event-bus/default"

  # 以下は Runtime環境上で cd_pipeline_lambda pattern を動かしてから設定する
  artifact_store_bucket_encryption_key_arn = "arn:aws:kms:${data.aws_region.current.name}:${local.runtime_account_id}:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

関連するpattern

cd_pipeline_lambda_trigger patternに関連するpatternを、以下に記載します。

pattern名 説明
ci_pipeline pattern Lambda関数をデプロイするための資材をまとめたzipファイルを格納するS3バケットを生成します。
cd_pipeline_lambda pattern 自動デプロイをするためのパイプラインを構築します。

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
artifact_store_bucket_arn 本ロールがアクセスするRuntime環境のArtifact storeのARN。artifact storeはcd_pipeline_lambda patternのインスタンス作成時に作成される。形式はarn:aws:s3:::[アーティファクトストアのバケット名]となるため、バケット名さえ決定すればcd_pipeline_lambda patternの適用を待たずに設定可能 string n/a yes
pipeline_name CodePipelineの名前 string n/a yes
runtime_account_id Runtime環境のアカウントID string n/a yes
source_bucket_arn デプロイ元となるS3バケットのARN string n/a yes
target_event_bus_arn 送信先のEventBusのARN string n/a yes
artifact_store_bucket_encryption_key_arn 本ロールがアクセスするRuntime環境のArtifact store暗号化用CMKのARN。artifact storeはcd_pipeline_lambda patternのインスタンス作成時に作成される string null no
deployment_source_object_key CodePipelineでデプロイされるLambda関数定義が圧縮されたzipファイルのS3 Object Key string "source.zip" no

Outputs

Name Description
cross_account_access_role_arn CodePipelineからのクロスアカウントアクセスに使用するRoleのARN

  1. Amazon CloudWatch Events 

  2. CodePipelineによるデプロイ処理を指しています 


※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.