Я настроил корзину AWS S3 для хранения XML-файлов карты сайта.Они будут периодически обновляться некоторыми функциями, находящимися в лямбдах AWS.У меня есть лямбда, отправляющая объект sitemap.xml (это не фактический файл, это карта сайта, которая создается после сканирования сайта, а затем форматируется как XML на лету) в мое ведро S3, однако ничего не происходит.Я не получаю ошибок ни в лямбда-логах, ни в логах S3.К моей лямбде, которая пытается сделать запрос к S3, прикреплена политика AmazonS3FullAccess
.
В журналах S3 я вижу, что она запускается, и в журналах отображаются все 200, но я не вижу своих данныхв ведре S3.Для устранения неполадок я даже ослабил политику S3 Bucket, чтобы принимать все запросы.Все еще не повезло.
Одна странность состоит в том, что моя корзина S3 продолжает бесконечно генерировать журналы после ее запуска;долго после того, как мой запрос был закрыт.Когда я открываю файлы журнала, некоторые из них показывают кучу успешных запросов пут, а другие показывают 404 и все типы ошибок от запросов, которые я даже не делаю!Например, вчера вечером я пытался написать в свое ведро S3.Этим утром у меня было сгенерировано 300 файлов журналов, но в моем S3 ничего нет.Файлы журнала имели значения 200, 400, 404 в зависимости от типа запроса (REST.GET.BUCKET, BATCH.DELETE.OBJECT, REST.GET.NOTIFICATION, REST.GET.WEBSITE, REST.PUT.BUCKETPOLICY и т. Д.)Я только делаю запрос PUT, поэтому я не знаю, почему в журналах отображаются все эти запросы.
Вот мой код:
[bunch of imports and AWS config stuff]
exports.handler = async(event) => {
let urlArray;
let metadataArray;
let sitemapObject;
const parsedData = JSON.parse(event.Records[0].Sns.Message);
try {
// separating two different arrays of objects from an outer array
metadataArray = parsedData[0];
urlArray = parsedData[1];
const newlyMergedArray = await mergeSpecificDataFromBothArrays(urlArr, vidArr);
sitemapObject = await generateSitemap(newlyMergedArray);
} catch (error) {
throw error;
}
const dispatchToS3 = () => {
const params = {
Body: sitemapObject,
Bucket: 'sitemap-service-s3',
Key: 'my_website.com/sitemap.xml'
};
s3.putObject(params, (error, data) => {
if (error) {
console.log(this.httpResponse.body.toString());
console.log(this.httpResponse.headers);
console.log(error.stack);
throw error;
} else {
console.log(data);
}
});
};
try {
await dispatchToS3();
} catch (error) {
throw error;
}
}
sitemapObject
- это объект, который был преобразован в XML прямо перед тем, как я отправлю его на S3.Может ли S3 принимать XML?Если да, должен ли я применить JSON.stringify
к нему до выполнения putObject
?Хотя я попытался отправить sitemapObject в виде строковых и неструктурированных данных.putObject
ничего не делает в обоих случаях.Должен ли я отправлять эти данные как фактический объект JSON вместо формата XML?
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://www.mywebsite.com/path/to/video_url</loc>
<video:video>
<video:title>Video Title/video:title>
<video:description/>
<video:thumbnail_loc>http://mywebsite.com/path/to/thumbnail</video:thumbnail_loc>
<video:player_loc>https://third_party_video_hosting_site.com/path/to/player</video:player_loc>
<video:duration>2:06</video:duration>
</video:video>
</url>
<url>
<loc>https://www.mywebsite.com/path/to/video_url</loc>
<video:video>
<video:title>Video Title/video:title>
<video:description/>
<video:thumbnail_loc>http://mywebsite.com/path/to/thumbnail</video:thumbnail_loc>
<video:player_loc>https://third_party_video_hosting_site.com/path/to/player</video:player_loc>
<video:duration>2:06</video:duration>
</video:video>
</url>
</urlset>
Вот моя политика S3 Bucket:
{
"Version": "2012-10-17",
"Id": "Policy12345678910",
"Statement": [
{
"Sid": "Stmt12345678910",
"Effect": "Allow",
"Principal": {
"AWS": "*" // this wildcard is for troubleshooting only. I would make this more specific/secure once I'm no longer troubleshooting.
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::sitemap-service-s3/my_website.com"
}
]
}