当前位置: 首页 > 知识库问答 >
问题:

Terraform:通知SNS的CloudWatch事件

龙弘盛
2023-03-14

我正在学习TF并尝试应用一个架构体系来创建:

  1. 一个简单的lambda函数
  2. 一个SNS话题
  3. 让lambda订阅SNS主题
  4. 以一定间隔向主题发布消息的Cloud Watch事件
  5. 一个Cloud Watch日志组,用于检查lambda是否收到SNS的通知
  6. 允许来自SNS的调用的lambda权限

我能够成功地应用它。基础架构看起来非常好(当我通过可视化aws控制台自己创建时,它具有相同的方面)

但云观察事件不会被触发(当从TF构建时),因此不会向SNS发布消息,也不会调用lambda。我不知道为什么

有人知道我该如何做到这一点吗?吼叫我的。tf脚本:

provider "aws" {
  region = "us-east-1"
}

//lambda function handler & code file
resource "aws_lambda_function" "lambda-function" {
  function_name = "Function01"
  handler = "com.rafael.lambda.Function01"
  role = "arn:aws:iam::12345:role/LambdaRoleTest"
  runtime = "java8"
  s3_bucket = aws_s3_bucket.sns-test.id
  s3_key = aws_s3_bucket_object.file_upload.id
  source_code_hash = filebase64sha256("../target/sns-cw-lambda-poc.jar")
}

//allow sns to call lambda
resource "aws_lambda_permission" "allow-sns-to-lambda" {
  function_name = aws_lambda_function.lambda-function.function_name
  action = "lambda:InvokeFunction"
  principal = "sns.amazonaws.com"
  source_arn = aws_sns_topic.call-lambdas-topic.arn
  statement_id = "AllowExecutionFromSNS"
}

//app s3 repository
resource "aws_s3_bucket" "sns-test" {
  bucket = "app-bucket-12345"
  region = "us-east-1"
}

//app jar file
resource "aws_s3_bucket_object" "file_upload" {
  depends_on = [
    aws_s3_bucket.sns-test
  ]
  bucket = aws_s3_bucket.sns-test.id
  key = "sns-cw-lambda-poc.jar"
  source = "../target/sns-cw-lambda-poc.jar"
  server_side_encryption = "AES256"
  etag = filebase64sha256("../target/sns-cw-lambda-poc.jar")
}

//to check lambda exec logs
resource "aws_cloudwatch_log_group" "lambda-cloudwatch-logs" {
  name = "/aws/lambda/${aws_lambda_function.lambda-function.function_name}"
  retention_in_days = 1
}

//rule to trigger SNS
resource "aws_cloudwatch_event_rule" "publish-sns-rule" {
  name = "publish-sns-rule"
  schedule_expression = "rate(1 minute)"
}

//cloud watch event targets SNS
resource "aws_cloudwatch_event_target" "sns-publish" {
  count = "1"
  rule = aws_cloudwatch_event_rule.publish-sns-rule.name
  target_id = aws_sns_topic.call-lambdas-topic.name
  arn = aws_sns_topic.call-lambdas-topic.arn
}

//SNS topic to subscribe
resource "aws_sns_topic" "call-lambdas-topic" {
  name = "call-lambdas-topic"
}

//lambda subscribes the topic, so it should be nofied when other resource publishes to the topic
resource "aws_sns_topic_subscription" "sns-lambda-subscritption" {
  topic_arn = aws_sns_topic.call-lambdas-topic.arn
  protocol = "lambda"
  endpoint = aws_lambda_function.lambda-function.arn
}

共有1个答案

韩楷
2023-03-14

我想通了,我忘记添加允许CloudWatch发布到SNS主题的SNS策略。要使上述脚本正常工作,只需添加以下内容:

resource "aws_sns_topic_policy" "default" {
  count  = 1
  arn    = aws_sns_topic.call-lambdas-topic.arn
  policy = "${data.aws_iam_policy_document.sns_topic_policy.0.json}"
}

data "aws_iam_policy_document" "sns_topic_policy" {
  count = "1"
  statement {
    sid       = "Allow CloudwatchEvents"
    actions   = ["sns:Publish"]
    resources = [aws_sns_topic.call-lambdas-topic.arn]

    principals {
      type        = "Service"
      identifiers = ["events.amazonaws.com"]
    }
  }
}
 类似资料:
  • 我正在尝试配置Cloudwatch事件规则(以触发SNS通知),以便在某人担任特定角色时: 其中是帐户ID,是我要提醒的角色。 这无法触发任何通知,但是,当我在Cloudtrail Insights中搜索事件时: 我确实得到了应该触发规则的结果: 为了尝试简化事情并捕获更广泛的事件集,我还尝试了以下规则(将所有AssumeRole事件捕获到任何角色): 此规则也无法触发。 有没有人对如何配置Clo

  • 我正在尝试配置cloudwatch事件规则,这将触发sns主题。我一直面临着从cloutwatch规则和terraform创建的事件模式触发sns主题的问题。下面是我的地形代码: 在aws用户界面上应用选中的事件模式后,如下所示: 它在创建s3 bucket时出现调用失败错误。然后我从aws控制台重新保存为: 然后就过去了。 有人能建议我如何禁用地形重新安排事件模式。

  • 在创建平台应用程序时,我尝试创建应用程序和消息推送平台选择GCM,然后添加API密钥,我得到了以下结果。 无效参数:属性原因:平台凭据无效(服务:Amazon SNS;状态代码:400;错误代码:InvalidParameter;请求ID:44a04d15-c58b-5bf8-859e-0311947aac6c) 这意味着什么?我如何修复它?

  • 每次更新ECS服务时(更新完成或达到所需状态后),我都希望收到一封电子邮件 我考虑过CloudWatch事件规则将SNS主题设置为目标(即确认的电子邮件地址)。然而,它不起作用。 这是我的自定义事件模式: 我也尝试过: TASKSET_STEADY_STATE CAPACITY_PROVIDER_STEADY_STATE SERVICE_DESIRED_COUNT_UPDATED 我正在通过中情局

  • 我正试图在加利福尼亚州北部地区创建CloudWatch警报,因为那里是我的EC2所在地。 我想向同时支持电子邮件和短信的SNS主题发送通知,而n.california不支持,因此我在俄勒冈州创建了一个同时支持电子邮件和短信的SNS主题。 该主题没有出现在“发送通知到:”下拉列表中,在线阅读似乎我应该能够单击“输入列表”并输入来自另一个地区的ARN,但是当我这样做时,我得到一个错误说:

  • 我正在尝试创建一个AWS Cloudwatch事件规则,以便在运行特定任务的容器成功完成运行时发送SNS电子邮件通知。我已经浏览了Terraform文档,但找不到一种动态注入taskArn的好方法: 例如,这里的文档示例提供了相同的硬编码<代码> 是否有一种模板文件方法可以动态插入我的ARN而无需硬编码?