Я обновил свой исходный пост, так как продвинулся немного дальше, и у меня работает запрос моей CW Alarms. Теперь ниже выводится состояние моих сигналов CW в консоли и в нужном мне формате. Что я сейчас пытаюсь сделать, так это взять вывод и загрузить его в виде текстового файла в корзину S3. Это возможно?
CW код тревоги
import { CloudWatchClient, DescribeAlarmsCommand } from "@aws-sdk/client-cloudwatch";
const REGION = "eu-west-2";
const cwclient = new CloudWatchClient({ region: REGION });
export const handler = async() => {
const cwparams = {};
const cw = new DescribeAlarmsCommand(cwparams);
try {
const cwdata = await cwclient.send(cw);
cwdata.MetricAlarms.forEach(function (item) {
console.info('\n%j', {alarmname:item.AlarmName,alarmstate:item.StateValue});
});
} catch (error) {
}
};
Вывод
Function Logs
START RequestId: xxxxxxxxxxxxxxxxxxx Version: $LATEST
2022-11-30T09:48:34.655Z xxxxxxxxxxxxxxxxxxx INFO
{"alarmname":"my-alarm-1","alarmstate":"OK"}
2022-11-30T09:48:34.655Z xxxxxxxxxxxxxxxxxxx INFO
{"alarmname":"my-alarm-2","alarmstate":"OK"}
END RequestId: xxxxxxxxxxxxxxxxxxx
Я просмотрел SDK для s3 PutObjectCommand и протестировал приведенное ниже, что позволяет мне загрузить файл с некоторым текстовым содержимым, но я не уверен, как я могу объединить данные CW Alarm с этим кодом, чтобы " Body» текстового файла — это мои данные CW Alarm.
Код S3
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
export const handler = async() => {
const bucketName = "mybucket";
const keyName = "test.json";
const s3 = new S3Client({});
const s3putCommand = new PutObjectCommand({
Bucket: bucketName,
Key: keyName,
Body: "Hello" // I would like this to be my CW Alarm data
});
try {
await s3.send(s3putCommand);
console.info('Successfully uploaded data to ' + bucketName + '/' + keyName);
} catch (error) {
}
};
Вывод
Function Logs
START RequestId: xxxxxxxxxxxxxxxxxxx Version: $LATEST
2022-11-30T09:56:45.585Z xxxxxxxxxxxxxxxxxxx INFO Successfully uploaded data to mybucket/test.json
END RequestId: xxxxxxxxxxxxxxxxxxx
Моя цель состоит в том, чтобы файл test.json выглядел так:
{"alarmname":"my-alarm-1","alarmstate":"OK"} {"alarmname":"my-alarm-2","alarmstate":"OK"}
Спасибо.
Вы используете устаревший AWS SDK для JavaScript. Обратитесь к новой библиотеке кода AWS, чтобы узнать о последнем рекомендуемом пакете SDK для использования здесь:
URL:
Https://docs.aws.amazon.com/code-library/latest/ug/javascript_3_cloudwatch_code_examples.html
Я обновил исходный пост с моим прогрессом и моей последней задачей. Надеюсь, кто-то может помочь мне заставить это работать так, как я хотел бы.
С помощью коллеги я нашел ответ на этот вопрос. Пока в вашей лямбда-функции ваш индексный файл называется "index.mjs"
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { CloudWatchClient, DescribeAlarmsCommand } from "@aws-sdk/client-cloudwatch";
import { Upload } from "@aws-sdk/lib-storage";
const REGION = "eu-west-2";
const cwclient = new CloudWatchClient({ region: REGION });
export const handler = async () => {
const cwparams = {};
const cw = new DescribeAlarmsCommand(cwparams);
const alarmData = [];
const bucketName = "mybucket";
const keyName = "test.json";
const s3 = new S3Client({});
try {
const cwdata = await cwclient.send(cw);
cwdata.MetricAlarms.forEach(function (item) {
alarmData.push({
alarmname: item.AlarmName,
alarmstate: item.StateValue,
});
});
} catch (error) {}
const s3putCommand = new Upload({
client: s3,
params: {
Bucket: bucketName,
Key: keyName,
Body: JSON.stringify(alarmData),
},
});
try {
const data = await s3putCommand.done();
console.info(data);
} catch (error) {
console.info(error);
}
};
А, спасибо за это. У меня все еще есть проблемы с его работой, но я посмотрю больше на обновленную версию.