1

我正在使用 terraform( terraform ) 和 localstack( localstack ) 并尝试创建 aws_cloudwatch_event_rule。我收到一个错误:

错误:更新 CloudWatch 事件规则失败:UnrecognizedClientException:请求中包含的安全令牌无效。状态码:400,请求 ID:2d0671b9-cb55-4872-8e8c-82e26f4336cb

我不确定为什么会收到此错误,因为这可以在 AWS 中创建资源,但不能在 localstack ‍♂️ 上创建资源。有人对如何解决这个问题有任何建议吗?谢谢。

它是一个大型 terraform 项目,所以我无法共享所有代码。这是相关部分。

resource "aws_cloudwatch_event_rule" "trigger" {
  name        = "trigger-event"
  description = "STUFF"
  schedule_expression = "cron(0 */1 * * ? *)"
}

resource "aws_cloudwatch_event_target" "trigger_target" {
  rule      = "${aws_cloudwatch_event_rule.trigger.name}"
  arn       = "${trigger.arn}"
}
4

1 回答 1

3

我意识到这是一个老问题,但我刚刚遇到了这个问题。我想分享为我解决的问题,以防它帮助到这里的其他人。这适用于 terraform 0.12(也应该适用于0.13)和 AWS provider 3.x

当您收到The security token included in the request is invalid错误时,通常意味着 terraform 尝试针对真正的 AWS 而不是 localstack 执行操作。

以下应解决创建 CloudWatch Event 规则的问题。

  1. 确保您events在 localstack 中运行该服务。cloudwatch提供 CloudWatch Events 接口的是这个服务,而不是。例如,如果您从命令行运行 localstack:
SERVICES=cloudwatch,events localstack start
  1. 确保 terraform 配置中的 AWS 提供程序指向 localstack。与第 (1) 步一样,我们需要确保有专门针对 CloudWatch Events 的设置。在 AWS 提供商配置中,即cloudwatchevents.
provider "aws" {
  version = "~> 3.0"

  profile                     = "<profile used for localstack>"
  region                      = "<region configured for localstack>"
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    # Update the urls below if you've e.g. customized localstack's port
    cloudwatch        = "http://localhost:4566"
    cloudwatchevents  = "http://localhost:4566"
    iam               = "http://localhost:4566"
    sts               = "http://localhost:4566"
  }
}

现在,terraform apply应该成功地针对 localstack 运行。

另一个需要注意的问题是 localstack 当前不持久化 CloudWatch 或 CloudWatch Events 数据,即使您启用了持久性也是如此。因此,当您终止或重新启动 localstack 时,任何 CloudWatch Events 规则都将丢失。

于 2020-10-23T03:33:13.563 回答