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

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

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

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

AWS Lambda

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

AWS(Amazon Web Services)

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

受付中

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

Baloncesto
Baloncesto

総合スコア7

Terraform

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

AWS Lambda

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

AWS(Amazon Web Services)

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

1回答

0評価

0クリップ

139閲覧

投稿2022/06/20 05:11

編集2022/06/24 20:46

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

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 }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Terraform

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

AWS Lambda

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

AWS(Amazon Web Services)

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