amazon-web-servicesaws-lambdaterraformterraform-provider-awsamazon-lex

Terraform For Using AWS Lambda With Amazon Lex


I have been having some trouble trying to get the fulfillment_activity codehook to work so that I can use Lambda Functions for the backend. For some reason, I am getting this error message from Terraform.

Error: error waiting for Lex Bot (helloBot) create: unexpected state 'FAILED', wanted target 'NOT_BUILT, READY, READY_BASIC_TESTING'. last error: Intent 'sample_intent' has an invalid message version defined for its fulfillment.

Here is my Terraform config:

# AWS Lex Bot
resource "aws_lex_bot" "helloBot" {
  depends_on = [ aws_lex_intent.sample_intent ]
  locale                      = "en-US"
  name                        = "helloBot"
  process_behavior            = "BUILD"
  voice_id                    = "Salli"
  create_version              = true
  idle_session_ttl_in_seconds = 300
  child_directed              = false

  abort_statement {
    message {
      content      = "Abort Abort!"
      content_type = "PlainText"
    }
  }

  clarification_prompt {
    max_attempts = 2

    message {
      content      = "No Idea What You're Saying!"
      content_type = "PlainText"
    }
  }

  intent {
    intent_name    = "sampleIntentName"
    intent_version = aws_lex_intent.sample_intent.version
  }
}

resource "aws_lambda_permission" "lex_sample_intent_lambda" {
  statement_id  = "AllowExecutionFromAmazonLex"
  action        = "lambda:InvokeFunction"
  function_name = "someLambdaFunctionName"
  principal     = "lex.amazonaws.com"

  # https://docs.aws.amazon.com/lex/latest/dg/gs-cli-update-lambda.html
  source_arn = "arn:aws:lex:myRegion:accountId:intent:sampleIntentName:*"
}

# AWS Lex Intents
data "aws_lambda_function" "existing" {
  function_name = "someLambdaFunctionName"
  qualifier     = "dev"
}

resource "aws_lex_intent" "sample_intent" {
  create_version = true
  name           = "sampleIntentName"

  fulfillment_activity {
    type = "CodeHook"
    code_hook {
      message_version = "1.0"
      uri             = data.aws_lambda_function.existing.qualified_arn
    }
  }

  sample_utterances = [
    "hi",
    "hello"
  ]
}

I looked at the cli documentation and it appears that we are supposed to use "1.0" for the message version.


Solution

  • It looks like the Terraform configuration should be correct. The problem was related to the data type of the message version when it was a variable. It was incorrectly set as a number instead of a string.