Terraformで複数のファイルをzip化してLambdaにアップロードする方法

プログラミング

こんにちは!

本日はTerraformで複数のファイルをzip化してLambdaにアップロードする方法について記載していきたいと思います。

1つのLambdaにつき1つのファイルをアップロードするサンプルコードの記事はたくさん見つかりましたが、複数アップロードする記事は見当たらずハマったため同じようなことをされたい方は参考にしてみてください。

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

具体的なコードの書き方

Terraformで複数ファイルをまとめてzip化してLambdaにアップロードするには以下のように記載します。

次の章から各コードについて解説していきますので先に動くコードの全体像を見たい方は下記をまずご覧ください。

locals {
  source_files = [
  # zipにまとめたい複数ファイルのpathをapplyを実行するtfファイルから書く
    "./lambda_src_files/src1.py",
    "./lambda_src_files/src2.py",
    "./lambda_src_files/src3.py"
  ]
}

data "template_file" "t_file" {
  count = "${length(local.source_files)}"
  template = "${file(element(local.source_files, count.index))}"
}

data "archive_file" "zip_function" {
  type = "zip"
  # zip化したファイルの出力先を書く
  output_path = "./lambda_src_files/source_files.zip"
  # zip化するファイルの数だけインデックスをずらしてsourceを定義する(今回の例では3つ)
  source {
    filename = "${basename(local.source_files[0])}"
    content = "${data.template_file.t_file.0.rendered}"
  }
  source {
    filename = "${basename(local.source_files[1])}"
    content = "${data.template_file.t_file.1.rendered}"
  }
  source {
    filename = "${basename(local.source_files[2])}"
    content = "${data.template_file.t_file.2.rendered}"
  }
}

resource "aws_lambda_function" "your_lambda_name" {
  # 関連のない設定は省略
  # アップロードするzipファイルのpathを書く
  filename = "./lambda_src_files/source_files.zip"
  # 上で作成したdataリソースを選択
  source_code_hash = data.archive_file.zip_function.output_base64sha256
}

locals

localsではzip化してLambdaにアップロードしたいファイルのパスをローカル変数として定義します。

パスの始点は”~/”から始まる絶対パスか”./”から始まる相対パスで記載します。

“./”の”.”はTerraformファイルを実行するmoduleが書いてあるtfファイルのパスから記載します。(terraform applyコマンドを実行するパス)

例のようにzipにまとめてアップロードしたいファイル分のパスを記載してください。

locals {
  source_files = [
  # zipにまとめたい複数ファイルのpathをapplyを実行するtfファイルから書く
    "./lambda_src_files/src1.py",
    "./lambda_src_files/src2.py",
    "./lambda_src_files/src3.py"
  ]
}

template_file

template_fileではこれからzip化を行うテンプレートを作成します。

template_fileのresourceのパラメーターは全て変数の値に合わせて自動で値が変わるため、コードは全部丸々コピーするだけでOKです。

例にあるコードをそのまま使ってください。

data "template_file" "t_file" {
  count = "${length(local.source_files)}"
  template = "${file(element(local.source_files, count.index))}"
}

archive_file

archive_fileは実際にファイルをzip化するTerraformのresourceです。

ここでzip化したソースコードを後々Lambdaにアップロードします。

type

ここはzip形式でファイルを圧縮するため”zip”で固定です。

data "archive_file" "zip_function" {
  type = "zip"
output_path

作成したzipファイルを置くローカルPC上のパスを書きます。

zipファイルをアップロードするTerraformファイルの近く(この記事で作成するtfファイルの近くのパス)に配置するのがおすすめです。

  # zip化したファイルの出力先を書く
  output_path = "./lambda_src_files/source_files.zip"
source

zipの中に含めるファイルのファイル名とテンプレートを指定します。

例に習ってファイルの数分インデックスの数字をずらして記載してください。(例だと0~2)

  # zip化するファイルの数だけインデックスをずらしてsourceを定義する(今回の例では3つ)
  source {
    filename = "${basename(local.source_files[0])}"
    content = "${data.template_file.t_file.0.rendered}"
  }
  source {
    filename = "${basename(local.source_files[1])}"
    content = "${data.template_file.t_file.1.rendered}"
  }
  source {
    filename = "${basename(local.source_files[2])}"
    content = "${data.template_file.t_file.2.rendered}"
  }

aws_lambda_function

AWS上にLambdaのサービス本体を作成するコードです。

このresourceに関してはfilenameとsource_code_hashの属性のみ修正すればコードが動きます。

その他の属性に関しては修正の必要がないため、既に使われているコードをそのまま使用していただいて大丈夫です。

filename

filenameにはLambdaにアップロードしたいソースコードのzipファイルのパスを書きます。

先ほどのarchive_fileのresourceで作成したzipファイルをアップロードするため、archive_fileのresourceのoutput_path属性のパスと同じパスを記載してください。

  # アップロードするzipファイルのpathを書く
  filename = "./lambda_src_files/source_files.zip"
source_code_hash

source_code_hashではアップロードするソースコードのzipファイルに振られているハッシュ値を指定します。

例のようにarchive_fileのresourceの変数を直接参照してください。

  # 上で作成したdataリソースを選択
  source_code_hash = data.archive_file.zip_function.output_base64sha256

まとめ

本日はTerraformで複数のファイルをzip化してLambdaにアップロードする方法について紹介しました。

共通化クラスを作る際など、複数ファイルを扱う際には是非参考にしてください。

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

コメント