我想构建一个工具,每次通过任何通信媒介(电子邮件、slack 等)在 CodeDeploy 上构建成功或失败时都会通知用户。我已经浏览了他们的文档.. 除了长轮询之外什么都没有想到。知道是否有一些 webhook 选项可以在其中注册 URL 并收到通知?
4 回答
2016-04-27 更新
您现在可以创建在应用程序部署过程之前、期间和之后发送 Amazon SNS 通知的触发器。可以为整个部署或部署所针对的单个实例设置触发器,并在成功和失败时发送。
原始答案
还没有。
在此 AWS 论坛主题中,要求 CodeDeploy 发出事件,以便您可以使用 Lambda 来处理它们,而不是轮询详细信息。
AWS 工作人员的回答(强调我的):
我们在这里对 CodeDeploy 表示同意。不幸的是,我不能给你一个确切的发布日期,但请留意我们的公告,它很快就会到来。
这是一个 AWS Lambda 函数的要点,该函数将格式化的 CodeDeploy 通知发布到 Slack
https://gist.github.com/MrRoyce/097edc0de2fe001288be2e8633f4b22a
var services = '/services/...'; // Update this with your Slack service...
var channel = "#aws-deployments" // And this with the Slack channel
var https = require('https');
var util = require('util');
var formatFields = function(string) {
var
message = JSON.parse(string),
fields = [],
deploymentOverview;
// Make sure we have a valid response
if (message) {
fields = [
{
"title" : "Task",
"value" : message.eventTriggerName,
"short" : true
},
{
"title" : "Status",
"value" : message.status,
"short" : true
},
{
"title" : "Application",
"value" : message.applicationName,
"short" : true
},
{
"title" : "Deployment Group",
"value" : message.deploymentGroupName,
"short" : true
},
{
"title" : "Region",
"value" : message.region,
"short" : true
},
{
"title" : "Deployment Id",
"value" : message.deploymentId,
"short" : true
},
{
"title" : "Create Time",
"value" : message.createTime,
"short" : true
},
{
"title" : "Complete Time",
"value" : ((message.completeTime) ? message.completeTime : ''),
"short" : true
}
];
if (message.deploymentOverview) {
deploymentOverview = JSON.parse(message.deploymentOverview);
fields.push(
{
"title" : "Succeeded",
"value" : deploymentOverview.Succeeded,
"short" : true
},
{
"title" : "Failed",
"value" : deploymentOverview.Failed,
"short" : true
},
{
"title" : "Skipped",
"value" : deploymentOverview.Skipped,
"short" : true
},
{
"title" : "In Progress",
"value" : deploymentOverview.InProgress,
"short" : true
},
{
"title" : "Pending",
"value" : deploymentOverview.Pending,
"short" : true
}
);
}
}
return fields;
}
exports.handler = function(event, context) {
var postData = {
"channel": channel,
"username": "AWS SNS via Lamda :: CodeDeploy Status",
"text": "*" + event.Records[0].Sns.Subject + "*",
"icon_emoji": ":aws:"
};
var fields = formatFields(event.Records[0].Sns.Message);
var message = event.Records[0].Sns.Message;
var severity = "good";
var dangerMessages = [
" but with errors",
" to RED",
"During an aborted deployment",
"FAILED",
"Failed to deploy application",
"Failed to deploy configuration",
"has a dependent object",
"is not authorized to perform",
"Pending to Degraded",
"Stack deletion failed",
"Unsuccessful command execution",
"You do not have permission",
"Your quota allows for 0 more running instance"];
var warningMessages = [
" aborted operation.",
" to YELLOW",
"Adding instance ",
"Degraded to Info",
"Deleting SNS topic",
"is currently running under desired capacity",
"Ok to Info",
"Ok to Warning",
"Pending Initialization",
"Removed instance ",
"Rollback of environment"
];
for(var dangerMessagesItem in dangerMessages) {
if (message.indexOf(dangerMessages[dangerMessagesItem]) != -1) {
severity = "danger";
break;
}
}
// Only check for warning messages if necessary
if (severity == "good") {
for(var warningMessagesItem in warningMessages) {
if (message.indexOf(warningMessages[warningMessagesItem]) != -1) {
severity = "warning";
break;
}
}
}
postData.attachments = [
{
"color": severity,
"fields": fields
}
];
var options = {
method: 'POST',
hostname: 'hooks.slack.com',
port: 443,
path: services // Defined above
};
var req = https.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
context.done(null);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.write(util.format("%j", postData));
req.end();
};
在高层次上,您需要:
- 设置 SNS 主题
- 创建 CodeDeploy 触发器
sns:Publish
向 CodeDeploy IAM 角色添加权限- 使用传入 Webhook 配置 Slack
- 编写和配置一个 Lambda 函数来处理 CodeDeploy 的 SNS 消息,构造 Slack 消息并在 Incoming Webhook 处将它们发送到 Slack
我使用类似于上述要点的代码来为 CodeDeploy 事件的 Slack 通知设置 Lambda 函数。我记录了整个过程,包括此处的屏幕截图。
我在其他地方找不到类似的端到端指南,所以我希望这可以帮助其他偶然发现这个问题的人。
尽管没有本机解决方案,但您可以使用一种解决方法来完成此操作。您可以使用 lambda 来触发这些事件。在 AWS 博客上,他们展示了当您将文件上传到 S3 时如何通过 lambda 触发 codedeploy ( https://blogs.aws.amazon.com/application-management/post/Tx3TPMTH0EVGA64/Automatically-Deploy-from-Amazon- S3-使用-AWS-CodeDeploy)。使用同样的概念,您可以让您的 lambda 函数监听错误/成功存储桶,并修改您的 codedeploy 包以将文件上传到 s3,然后您可以将其用作事件触发器以通过 SES 发送电子邮件(https:/ /peekandpoke.wordpress.com/2015/02/26/dancing-the-lambada-with-aws-lambda-or-sending-emails-on-s3-events/) 或联系可以满足您需求的 Web 服务/页面。这可能有点做作,但它可以完成工作。