AWS Beanstalk - 创建新环境时向 Lambda 发送 SNS 通知

Posted

技术标签:

【中文标题】AWS Beanstalk - 创建新环境时向 Lambda 发送 SNS 通知【英文标题】:AWS Beanstalk - SNS notification to Lambda when new environment gets created 【发布时间】:2015-12-05 23:35:53 【问题描述】:

我使用 CF 模板来创建 Beanstalk 环境。我想在创建环境时通过 SNS 触发 Lambda 代码,这样我就可以使用 lambda 来触发 jenkins 作业以及新环境的集成测试。

在 Beanstalk 中成功创建环境后,有没有办法发送 SNS 消息?我已经定义了一个订阅 lambda 代码的主题。

beantalk API 允许您定义通知端点。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.sns.html

但是,如果我只能指定一个电子邮件地址并且我必须确认订阅,这是为了什么?如何使用它来自动触发 SNS 消息?

      
        "OptionName": "Notification Endpoint",
        "Namespace": "aws:elasticbeanstalk:sns:topics",
        "Value": "no-reply@example.com"
      ,
      
        "OptionName": "Notification Protocol",
        "Namespace": "aws:elasticbeanstalk:sns:topics",
        "Value": "email"
      ,

我发现的解决方法有点老套。我在堆栈创建过程结束时创建了一个 EC2 实例,并运行一些 AWS 命令​​以通过 UserData shell 发送 SNS 通知。这是唯一的方法吗?

【问题讨论】:

请注意,本文中出现的 JSON 语法与最新的 Amazon 参考文档 (docs.aws.amazon.com/elasticbeanstalk/latest/dg/…) 上的语法不一致。你有 ("OptionName", "Namespace", "Value");他们有(“option_name”、“namespace”、“value”)。这似乎是一张通向精神错乱的门票。 【参考方案1】:

我正在回答我自己的问题。在创建新的 Beanstalk 环境后,我设法弄清楚如何使用 SNS 触发 lambda 代码。

我创建了一个 sns 主题 service-configurator

并将其 ARN 和名称添加到模板中。

"OptionName": "通知主题 ARN", "命名空间": "aws:elasticbeanstalk:sns:topics", “价值”:“arn:aws:sns:us-east-1:273218181234:service-configurator” , "OptionName": "通知主题名称", "命名空间": "aws:elasticbeanstalk:sns:topics", “价值”:“服务配置器”

接下来,我将 sns 主题设置为我的 lambda 代码的事件源。

现在,每当环境发生某些事情(添加/删除实例、创建环境等)时,都会触发 lambda

【讨论】:

您不需要通知主题名称,通知主题 ARN 选项就足够了。 嗨,我在使用 SNS 时遇到了一些问题。只有部分事件是通过 SNS 报告的。一些重要的消息,如“服务器重新启动”永远不会出现。 @across 我不记得细节了。一般来说,整体结构是EBeanstalk to sns to lambda。 EBeanstalk 允许您设置一个电子邮件地址来接收某些事件,您只需输入您的 sns 主题而不是电子邮件。 @ChenLin 是的,问题是它工作正常。但我没有得到所有的事件,而只是其中的一部分。正如你提到的“服务器重新启动”不起作用【参考方案2】:

虽然Configuring Notifications with Elastic Beanstalk 没有提供发送Amazon SNS 通知的具体示例,但email 只是相应的默认设置。 AWS Elastic Beanstalk 选项设置,您还可以为大多数/所有其他协议创建订阅,请参阅选项 aws:elasticbeanstalk:sns:topics:

有效值httphttpsemailemail-jsonsqs

显然AWS Lambda 还没有被引用,但它只是另一个SNS protocol,所以我假设/希望该表还没有更新,类似下面的内容应该可以相应地工作(还没有不过我自己试过了):

  
    "OptionName": "Notification Endpoint",
    "Namespace": "aws:elasticbeanstalk:sns:topics",
    "Value": "<Your Lambda function ARN>"
  ,
  
    "OptionName": "Notification Protocol",
    "Namespace": "aws:elasticbeanstalk:sns:topics",
    "Value": "lambda"
  ,

【讨论】:

不怕!无论如何,使用 Terraform:ConfigurationValidationException: Configuration validation exception: Invalid option value: 'lambda' (Namespace: 'aws:elasticbeanstalk:sns:topics', OptionName: 'Notification Protocol'): Value is not one of the allowed values: [http, https, email, email-json, sqs]

以上是关于AWS Beanstalk - 创建新环境时向 Lambda 发送 SNS 通知的主要内容,如果未能解决你的问题,请参考以下文章

无法在 AWS Elastic Beanstalk 上创建新的 RDS 数据库

Amazon Elastic Beanstalk 在创建新环境时创建服务器实例

AWS Elastic beanstalk - 更改解决方案堆栈名称

将应用程序部署到 AWS Elastic Beanstalk 环境

登录角色时出现 AWS Elastic Beanstalk ServiceRole 错误

如何从 aws-sdk 中的 s3 存储桶创建 Elastic Beanstalk 实例?