如何使用terraform和localstack制作aws_cloudwatch_event_规则?

如何使用terraform和localstack制作aws_cloudwatch_event_规则?,terraform,localstack,Terraform,Localstack,我正在使用terraform()和localstack()并尝试创建一个aws\u cloudwatch\u event\u规则。我得到一个错误: 错误:更新CloudWatch事件规则失败:无法识别客户端异常:请求中包含的安全令牌无效。 状态代码:400,请求id:2d0671b9-cb55-4872-8e8c-82e26f4336cb 我不知道为什么会出现这个错误,因为这可以在AWS中创建资源,但不能在localstack上创建资源我意识到这是一个老问题,但我遇到了这个问题。我想和大家分享一

我正在使用terraform()和localstack()并尝试创建一个aws\u cloudwatch\u event\u规则。我得到一个错误:

错误:更新CloudWatch事件规则失败:无法识别客户端异常:请求中包含的安全令牌无效。 状态代码:400,请求id:2d0671b9-cb55-4872-8e8c-82e26f4336cb


我不知道为什么会出现这个错误,因为这可以在AWS中创建资源,但不能在localstack上创建资源我意识到这是一个老问题,但我遇到了这个问题。我想和大家分享一下我是如何解决这个问题的,以防它能帮助到那些最终来到这里的人。这适用于terraform
0.12
(也适用于
0.13
)和AWS提供商
3.x

当您获得请求中包含的安全令牌无效时,通常意味着terraform试图对真实AWS而不是localstack执行操作

下面应该解决创建CloudWatch事件规则的问题

  • 确保您正在本地堆栈中运行
    事件
    服务。正是这项服务,而不是
    cloudwatch
    ,提供了cloudwatch事件接口。例如,如果从命令行运行localstack:
  • 确保terraform配置中的AWS提供程序指向localstack。与第(1)步一样,我们需要确保有一个专门用于CloudWatch事件的设置。在AWS提供程序配置中,这是
    cloudwatchevents
  • 提供程序“aws”{
    version=“~>3.0”
    profile=“”
    region=“”
    跳过\u凭证\u验证=真
    跳过元数据api检查=true
    跳过\u请求\u帐户\u id=true
    端点{
    #如果您已经自定义了localstack的端口,请更新下面的URL
    cloudwatch=”http://localhost:4566"
    cloudwatchevents=”http://localhost:4566"
    iam=”http://localhost:4566"
    sts=”http://localhost:4566"
    }
    }
    
    现在,
    terraformapply
    应该可以在localstack上成功运行


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

    您可以共享您的Terraform代码吗?这看起来很像您试图在真实的AWS中创建Cloudwatch事件规则,而不是localstack。添加了它。谢谢。您是如何将其指向localstack的?您的aws提供程序是如何配置的?你能给我们看一下提供者块吗?首先想到的是添加
    skip\u credentials\u validation=true
    。你使用哪种服务?也许你需要使用EventBridge(CloudWatch事件)服务,谢谢!这对我很有帮助,但我还需要在我的提供者配置中添加
    cloudwatchlogs
    端点,以使我的
    aws\u cloudwatch\u log\u组
    资源正常工作。
    SERVICES=cloudwatch,events localstack start
    
    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"
      }
    }