SQS:EC2 实例启动时发布消息?
SQS: Publish a message when an EC2 instance starts?
有没有办法在EC2实例启动时自动在SQS上发布消息?
例如,您是否可以使用 Cloudwatch 设置一个 alarm 在实例启动时触发? Cloudwatch 上的所有警报似乎都与特定的 EC2 实例相关,而不是一般的 EC2 服务。
为了更好地理解这个问题并提供更准确的答案,需要进一步的信息。
我们是在谈论:
创建新实例并从 任何 AMI 启动?
从 特定的 AMI 创建并启动新实例?
启动刚刚处于停止状态的现有 AMI?
或者在规模组内创建一个新实例?
这些都会影响您创建您的 cloudwatch 警报的方式。
例如,如果它是现有的 ec2,您将按照以下方式使用状态检查:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html
虽然如果它是一个全新的 Ec2 实例已创建,您将需要使用更高级的 cloudtrail 日志警报,如下所示:
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cw_create_alarms.html
然而在那之后它将遵循相同的基本逻辑,即:
根据以下条件创建触发 SNS 的警报:
https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/ConsoleAlarms.html
让 SNS 通知程序根据以下内容发布到 SQS 主题:
https://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html
一如既往,尽管有很多方法可以给猫剥皮。
如果这是一个关键事件,并且我希望每个开始事件都有相同的典型响应,我个人会考虑 bootstrap 从木偶或厨师推出的脚本,这样所有事件的快速更改都集中在一个脚本中。
第 1 步:创建云监视规则以通知创建。根据按下启动按钮时 EC2 实例的生命周期。实例从 Pending 状态变为 运行 状态,并且 If 实例从停止状态变为 运行 状态。因此,为 Pending 状态创建规则
Create a Cloud watch Rule as specified in the image screenshot
第 2 步:创建阶跃函数。因为 cloud Trail 会延迟至少 20 分钟将所有事件记录在帐户中。如果您想要创建实例的用户的名称,此步骤功能很有用。
{
"StartAt": "Wait",
"States": {
"Wait": {
"Type": "Wait",
"Seconds": 1800,
"Next": "Ec2-Alert"
},
"Ec2-Alert":{
"Type": "Task",
"Resource":"arn:aws:lambda:ap-south-1:321039853697:function:EC2-Creation-Alert",
"End": true
}
}
}
第 3 步:创建用于通知的 SNS 主题
Step4 : 写一个lambda函数从云端获取日志并获取创建实例的用户名。
import json
import os
import subprocess
import boto3
def lambda_handler(event, context):
client = boto3.client('cloudtrail')
client1 = boto3.client('sns')
Instance=event["detail"]["instance-id"]
response = client.lookup_events(
LookupAttributes=[
{
'AttributeKey': 'ResourceName',
'AttributeValue': Instance
},
],
MaxResults=1)
test=response['Events']
st="".join(str(x) for x in test)
print(st)
user=st.split("Username")[1]
finalname=user.split(",")
Creator=finalname[0]
#print(st[st.find("Username")])
Email= "Hi All ,\n\n\n The User%s has created new EC2-Instance in QA account and the Instance id is %s \n\n\n Thank you \n\n\n Regard's lamda"%(Creator,Instance)
response = client1.publish(
TopicArn='arn:aws:sns:ap-south-1:321039853697:Ec2-Creation-Alert',
Message=Email
)
# TODO implement
return {
'statusCode': 200,
}
注意:如果实例从停止状态更改为 运行 状态或启动新实例,此代码会触发通知。
有没有办法在EC2实例启动时自动在SQS上发布消息?
例如,您是否可以使用 Cloudwatch 设置一个 alarm 在实例启动时触发? Cloudwatch 上的所有警报似乎都与特定的 EC2 实例相关,而不是一般的 EC2 服务。
为了更好地理解这个问题并提供更准确的答案,需要进一步的信息。
我们是在谈论:
创建新实例并从 任何 AMI 启动?
从 特定的 AMI 创建并启动新实例?
启动刚刚处于停止状态的现有 AMI?
或者在规模组内创建一个新实例?
这些都会影响您创建您的 cloudwatch 警报的方式。
例如,如果它是现有的 ec2,您将按照以下方式使用状态检查:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html
虽然如果它是一个全新的 Ec2 实例已创建,您将需要使用更高级的 cloudtrail 日志警报,如下所示: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cw_create_alarms.html
然而在那之后它将遵循相同的基本逻辑,即:
根据以下条件创建触发 SNS 的警报: https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/ConsoleAlarms.html
让 SNS 通知程序根据以下内容发布到 SQS 主题:
https://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html
一如既往,尽管有很多方法可以给猫剥皮。 如果这是一个关键事件,并且我希望每个开始事件都有相同的典型响应,我个人会考虑 bootstrap 从木偶或厨师推出的脚本,这样所有事件的快速更改都集中在一个脚本中。
第 1 步:创建云监视规则以通知创建。根据按下启动按钮时 EC2 实例的生命周期。实例从 Pending 状态变为 运行 状态,并且 If 实例从停止状态变为 运行 状态。因此,为 Pending 状态创建规则
Create a Cloud watch Rule as specified in the image screenshot
第 2 步:创建阶跃函数。因为 cloud Trail 会延迟至少 20 分钟将所有事件记录在帐户中。如果您想要创建实例的用户的名称,此步骤功能很有用。
{
"StartAt": "Wait",
"States": {
"Wait": {
"Type": "Wait",
"Seconds": 1800,
"Next": "Ec2-Alert"
},
"Ec2-Alert":{
"Type": "Task",
"Resource":"arn:aws:lambda:ap-south-1:321039853697:function:EC2-Creation-Alert",
"End": true
}
}
}
第 3 步:创建用于通知的 SNS 主题
Step4 : 写一个lambda函数从云端获取日志并获取创建实例的用户名。
import json
import os
import subprocess
import boto3
def lambda_handler(event, context):
client = boto3.client('cloudtrail')
client1 = boto3.client('sns')
Instance=event["detail"]["instance-id"]
response = client.lookup_events(
LookupAttributes=[
{
'AttributeKey': 'ResourceName',
'AttributeValue': Instance
},
],
MaxResults=1)
test=response['Events']
st="".join(str(x) for x in test)
print(st)
user=st.split("Username")[1]
finalname=user.split(",")
Creator=finalname[0]
#print(st[st.find("Username")])
Email= "Hi All ,\n\n\n The User%s has created new EC2-Instance in QA account and the Instance id is %s \n\n\n Thank you \n\n\n Regard's lamda"%(Creator,Instance)
response = client1.publish(
TopicArn='arn:aws:sns:ap-south-1:321039853697:Ec2-Creation-Alert',
Message=Email
)
# TODO implement
return {
'statusCode': 200,
}
注意:如果实例从停止状态更改为 运行 状态或启动新实例,此代码会触发通知。