如何将Shell脚本(JSON)输出发送到AWS SNS主题?

3

我在AWS控制台创建了一个ARN主题,并创建了一个订阅,使用电子邮件确认了订阅。

我在AWS上运行了一个EC2实例,编写了一个小脚本来发送一些细节,例如实例类型、操作系统使用情况、架构、安装的JDK,并使用"printf"命令将其格式化为"json"。

我想将该脚本的json输出发送到我创建的主题中。计划未来自动化这个内容,但现在只是为了测试目的。

我尝试的代码:

#/bin/bash
AWS_ACCESS_KEY=xUISTaZscgstTgsreTTS
AWS_SECRET_KEY=8hsggTjakjst86AHGSR98agHHYI
credentials="-I $AWS_ACCESS_KEY -S $AWS_SECRET_KEY"
topicARN=arn:aws:sns:eu-west-1:9876577867654:xyzsy-ex:9d18e516-25h3-81h1-n148-chqa712qi1p0
json="$(./temp.sh)"
aws sns publish --topic-arn $topicARN --message-structure json --message "${json}"

temp.sh输出内容:

{
    "component": {
        "component": "xyz-name",
        "comp_version": "03"
    },
    "Instance": {
        "Instance_Type": "t2.small",
        "Instance_ID": "i-1e993001234q56789"
        "operatingsystem": "rhel"
    },
    "JDK": "1.8.0_111"
}   

但是它要求提供AWS区域,如果提供了就抱怨凭据的有效性。是否有一种方法可以动态地提供凭据,而不是设置shell从".aws/config"中选择?

我打算将其作为cronjob运行,以便每20分钟将输出发送到主题。

1个回答

2
文档中:

AWS CLI按以下顺序查找凭据和配置设置:

  • 命令行选项 - 可以将区域、输出格式和配置文件指定为命令选项,以覆盖默认设置。
  • 环境变量 - AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY等。
  • AWS凭证文件 - 位于Linux、OS X或Unix上的~/.aws/credentials,或位于Windows上的C:\Users\USERNAME\.aws\credentials。此文件可以包含多个命名配置文件以及一个默认配置文件。
  • CLI配置文件 - 通常位于Linux、OS X或Unix上的~/.aws/config,或位于Windows上的C:\Users\USERNAME\.aws\config。此文件可以包含一个默认配置文件、命名配置文件和每个CLI特定的配置参数。
  • 实例配置文件凭证 - 这些凭证可用于具有分配实例角色的EC2实例,并通过Amazon EC2元数据服务传递。
因此,您可以从调用的aws sns命令中传递凭据:
#/bin/bash
topicARN=arn:aws:sns:eu-west-1:9876577867654:xyzsy-ex:9d18e516-25h3-81h1-n148-chqa712qi1p0
json="$(./temp.sh)"
AWS_ACCESS_KEY=xUISTaZscgstTgsreTTS AWS_SECRET_KEY=8hsggTjakjst86AHGSR98agHHYI aws sns publish --topic-arn $topicARN --message-structure json --message "${json}"

感谢您的快速回复。我尝试了您的解决方案,现在不再要求凭据,但仍然提示需要指定区域。“您必须指定一个区域。您也可以通过运行'aws configure'来配置您的区域。”我甚至尝试像凭据一样附加区域,但仍然无法解决问题。 - Krishna Ghanta Chowdary
@KrishnaGhantaChowdary 对于区域,您需要将 --region 参数传递给命令:AWS_ACCESS_KEY=xUISTaZscgstTgsreTTS AWS_SECRET_KEY=8hsggTjakjst86AHGSR98agHHYI aws sns publish --topic-arn $topicARN --message-structure json --message "${json}" --region ap-south-1 - hjpotter92
哇哦...我进行了一些尝试和错误.. 它居然起作用了..现在我收到了一些错误消息:调用发布操作时发生错误(InvalidParameter):无效参数:消息结构 - JSON消息正文中没有默认条目。 - Krishna Ghanta Chowdary
@KrishnaGhantaChowdary,你的$json有问题 :) - hjpotter92
好的,感谢你的解释。当我尝试验证脚本输出的 JSON 数据时,它显示为有效的 JSON 格式。我们能直接将 JSON 对象推送到 SNS 主题吗? - Krishna Ghanta Chowdary
如果您仍在摸索,您必须将消息嵌入名为default的顶级SON对象中。@KrishnaGhantaChowdary 来自文档 https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/publish.html“Message参数的值必须:是一个语法上有效的JSON对象;并且至少包含一个名为“default”的顶级JSON键,其值为字符串。” - Jorge V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接