質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

947閲覧

Terraform Plan実行時に発生するエラーについて

Baloncesto

総合スコア7

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/06/20 05:11

編集2022/06/20 05:13

閲覧ありがとうございます。
表題の件でご質問があります。

Terraformを用いてLambdaを登録するコードを作成しているのですが、
以下エラーが発生します。
※複数登録したいため、countを用いております。

$ terraform plan ╷ │ Error: "function_name" doesn't comply with restrictions ("^(arn:[\\w-]+:lambda:)?([a-z]{2}-(?:[a-z]+-){1,2}\\d{1}:)?(\\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\\$LATEST|[a-zA-Z0-9-_]+))?$"): "var.targets[count.index].service_name" │ │ with aws_lambda_permission.default[0], │ on main.tf line 197, in resource "aws_lambda_permission" "default": │ 197: function_name = "${aws_lambda_function.default[count.index].function_name}" │ ╵

初歩的な質問で恐縮ですが、こちらのエラーの原因がわからず、手こずっております。
お忙しいところお手数おかけしますが、ご教示いただけますと幸いです。

Terraformのコードは以下となります。

136 # --------------------- 137 # Lambda 138 # --------------------- 139 140 data "archive_file" "default" { 141 type = "zip" 142 source_dir = "src" 143 output_path = var.output_path 144 } 145 146 resource "aws_lambda_function" "default" { 147 count = length(var.targets) 148 # filename = var.targets[count.index].output_path 149 filename = "var.targets[count.index].output_path" 150 # function_name = var.targets[count.index].service_name 151 function_name = "var.targets[count.index].service_name" 152 153 provider = aws.virginia 154 role = aws_iam_role.default.arn 155 handler = "lambda_function.lambda_handler" 156 source_code_hash = data.archive_file.default.output_base64sha256 157 runtime = "python3.9" 158 environment { 159 variables = { 160 SLACK_API_KEY = var.SLACK_API_KEY 161 } 162 } 163 } 164 165 166 167 # --------------------- 168 # IAM Role for Lambda Function 169 # --------------------- 170 171 resource "aws_iam_role" "default" { 172 name = var.service_name 173 provider = aws.virginia 174 description = "IAM Role for ${var.service_name}" 175 assume_role_policy = file("${var.service_name}-role.json") 176 } 177 178 resource "aws_iam_policy" "default" { 179 name = var.service_name 180 provider = aws.virginia 181 description = "IAM Policy for ${var.service_name}" 182 policy = file("${var.service_name}-policy.json") 183 } 184 185 resource "aws_iam_role_policy_attachment" "default" { 186 role = aws_iam_role.default.name 187 provider = aws.virginia 188 policy_arn = aws_iam_policy.default.arn 189 } 190 191 resource "aws_lambda_permission" "default" { 192 count = length(aws_lambda_function.default) 193 statement_id = "AllowExecutionFromSNS" 194 action = "lambda:InvokeFunction" 195 provider = aws.virginia 196 # function_name = aws_lambda_function.default.function_name 197 function_name = "${aws_lambda_function.default[count.index].function_name}" 198 principal = "sns.amazonaws.com" 199 source_arn = aws_sns_topic.topic.arn 200 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/06/20 08:00

この質問に対する本質的な回答ではないのでこちらに書きますが、個人的にTerraformでLambdaをデプロイするのはオススメしません。 ソースをzipにまとめる処理を毎回実行するのが面倒だったり、そこが何もしてなくても差分になってしまいがちなのと、ソースの中身まではTerraformで管理できないのでTerraformとは相性が良くないんですよね…。 https://blog.recruit.co.jp/rmp/infrastructure/post-16931/ 未だにこのへんは個人的にもどうするべきか悩むところなのですが、例えばTerraformとSAMを併用するとか、CDKとSAMを併用するとか、検討の余地がある部分ですね… 下記はTerraformとSAMを併用している例です。 https://dev.classmethod.jp/articles/sam-and-terraform-example/ ちなみにCDK for Terraformというものがあって、それを使ってLambda Functionをデプロイする方法もTerraformのドキュメントに載っています(こちらは試していないので、一応こういうものがありますよというものです) https://learn.hashicorp.com/tutorials/terraform/cdktf-assets-stacks-lambda?in=terraform/cdktf
guest

回答1

0

関数名の制約でエラーが出力されています。

CreateFunction - AWS Lambda

FunctionName
関数の名前。

Pattern: (arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-.]+)(:($LATEST|[a-zA-Z0-9-]+))?

151 function_name = "var.targets[count.index].service_name"

ここが原因だと思われます。ダブルクォーテーションで囲んでいるので、文字列の”var.targets[count.index].service_name"をfunction_nameに設定するコードになっています。

150 # function_name = var.targets[count.index].service_name

こちらが正しいように見受けられますが、コメントアウトされた理由がわかりません。何か不都合があったのでしょうか。

投稿2022/06/20 07:34

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Baloncesto

2022/06/20 07:51

ご回答いただきありがとうございます。 ご教示頂いた通り、150行目と151行目のコメントアウトを逆にしましたところ、 これまで発生していたエラーは解消されたように見えたのですが、 以下のエラーとなりました。 こちらのエラーの原因について、教えていただくことはできますでしょうか? お忙しいところ恐縮ですが、宜しくお願いいたします。 ``` ╷ │ Error: Missing map element │ │ on main.tf line 150, in resource "aws_lambda_function" "default": │ 150: function_name = var.targets[count.index].service_name │ ├──────────────── │ │ count.index is 1 │ │ var.targets is list of map of string with 2 elements │ │ This map does not have an element with the key "service_name". ```
jhashimoto

2022/06/24 11:46 編集

var.targetsのvariableを宣言している箇所を質問文に追記してもらえますか?それと今さらですが、yu_1985さんのコメントも加味してご検討ください。私もLambda関数はTerraform管理から除外しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問