Получайте уведомления об успешных / неудачных сборках на CodeDeploy от Amazon
Я хотел бы создать инструмент, который бы уведомлял пользователя каждый раз, когда была успешная или неудачная сборка на CodeDeploy через любую коммуникационную среду (электронная почта, слабость и т. Д.). Я просмотрел их документацию... и ничего, кроме длинных опросов, не приходит на ум. Любая идея, если есть какой-то вариант webhook, где я могу зарегистрировать URL и получать уведомления?
3 ответа
Обновление 2016-04-27
AWS официально объявила об этом в феврале 2016 года:
Теперь вы можете создавать триггеры, которые отправляют уведомления Amazon SNS до, во время и после процесса развертывания ваших приложений. Триггеры могут быть установлены для развертывания в целом или для отдельных экземпляров, на которые нацелено развертывание, и отправляются как при успехах, так и при сбоях.
Оригинальный ответ
Еще нет.
В этой ветке форума AWS было запрошено, чтобы CodeDeploy генерировал события, чтобы вы могли использовать Lambda для их обработки вместо опроса деталей.
Ответ сотрудников AWS (выделено мной):
Мы здесь на CodeDeploy согласны. К сожалению, я не могу дать вам точную дату релиза, но следите за нашими объявлениями, они скоро появятся.
Вот суть лямбда-функции AWS, которая отправляет отформатированное уведомление 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();
};
На высоком уровне вам необходимо:
- Настройте тему в соцсетях
- Создать триггер CodeDeploy
- добавлять
sns:Publish
разрешения на роль IAM CodeDeploy - Настройте Slack с помощью входящего веб-перехватчика
- Напишите и настройте функцию Lambda для обработки сообщений SNS CodeDeploy, создания сообщений Slack и отправки их в Slack на входящем Webhook
Я использовал код, аналогичный приведенному выше, чтобы настроить функцию Lambda для уведомлений Slack для событий CodeDeploy. Я задокументировал всю процедуру, включая скриншоты здесь.
Я не смог найти в другом месте аналогичного сквозного руководства, поэтому надеюсь, что это поможет кому-то еще, кто наткнется на этот вопрос.
Хотя нет собственного решения, есть обходной путь, который вы можете использовать для достижения этой цели. Вы можете использовать лямбду, чтобы вызвать эти события. В блоге AWS они показывают, как вызвать развертывание кода с помощью лямбды при загрузке файла на S3 ( https://blogs.aws.amazon.com/application-management/post/Tx3TPMTH0EVGA64/Automatically-Deploy-from-Amazon-S3-using-AWS-CodeDeploy). Используя эту же концепцию, вы можете заставить свою лямбда-функцию прослушивать корзину ошибок / успехов и изменять свой пакет codedeploy для загрузки файла в s3, который, в свою очередь, можно использовать в качестве триггера событий для отправки электронного письма через SES ( https://peekandpoke.wordpress.com/2015/02/26/dancing-the-lambada-with-aws-lambda-or-sending-emails-on-s3-events/) или обратитесь к веб-службе / странице, которая делает то, что вы хотите, Это может быть немного нелепо, но это делает работу.