Я хочу использовать лямбда-функцию для копирования содержимого из одного сегмента в другой. Это лямбда, которую я создал:
'use strict';
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var srcBucket = "bkctFrom";
var destBucket = "bkctTo";
module.exports.hello = async event => {
var params = {
Bucket: srcBucket
};
await s3.listObjects(params, function(err, data) {
if (err){
console.log(err, err.stack);
}
else{
var cont = data['Contents'];
var key="";
for (let [key, value] of Object.entries(cont)) {
key = value['Key'];
s3.copyObject({
CopySource: srcBucket + '/' + key,
Bucket: destBucket,
Key: key
},
function (copyErr,copyData){
if(copyErr){console.log(copyErr);}
else{console.log(copyData);}
}
);
}
}
});
};
Эта функция работает хорошо, когда я запускаю локально: sls invoke local -f hello
, все содержимое копируется из корзины bkctFrom
в bkctTo
.
Но когда я внедряю в aws, это не работает. Журнала ошибок нет, получен только результат выполнения.
На локальном компьютере вместо null
я получаю информацию о файлах, вставленных в корзину.
Это политика, которую я использую для создания роли для этой лямбды:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListSourceAndDestinationBuckets",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:ListBucketVersions"
],
"Resource": [
"arn:aws:s3:::bkctFrom",
"arn:aws:s3:::bkctTo"
]
},
{
"Sid": "SourceBucketGetObjectAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::bkctFrom/*"
},
{
"Sid": "DestinationBucketPutObjectAccess",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bkctTo/*"
}
]
}
Я использую без сервера, и это .yml
:
service: updaterepobucket
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-west-2
functions:
hello:
handler: handler.hello
# events:
# - http:
# path: users/create
# method: get
Я обновляю роль вручную в консоли aws: Здесь у них есть другое имя (только тест).
И даже если я установлю полный доступ к S3, он все равно не будет рабочее:
Если это работает из моего локального, но не работает из облака, вывод, что, возможно, есть что-то, связанное с разрешениями. Но я не знаю, чего не хватает в этой политике. Есть предположения?