2

Я новичок в AWS лямбда. Мой вопрос: У меня есть RPM в Jenkins (в AWS), который получает копию в ведро S3 с помощью плагина S3 artifacts. Мне нужно скопировать этот RPM в другой экземпляр EC2 из ведра S3. Есть ли способ, которым функция Lambda может запускать S3 для копирования файла RPM с S3 на Ec2 после его копирования с Jenkins на S3? неКак скопировать файл из экземпляра S3 в EC2 с помощью функции AWS Lambda?

 s3-plugin   lambda 

Дженкинс ---------------> S3 -----------> EC2

ответ

1

Короткий ответ: нет. Сам S3 ничего не может копировать.

Правильный способ подумать об этом - S3 может отправить уведомление, которое может запустить функцию лямбда. Тогда ваша функция лямбда могла бы что-то сделать с экземпляром. Это кажется довольно сложным.

Я пропустил использование Lambda и написал сценарий, который будет подписываться на S3 bucket уведомления SNS Topic непосредственно из ваших экземпляров. Этот скрипт будет загружать файл непосредственно в ваш экземпляр после его загрузки на S3. Это решение также масштабируемо, вы можете иметь много экземпляров, подписанных на эту тему и т. Д.

+0

Не могли бы вы рассказать о том, как работает ваш скрипт? Подписываться через http? – einSelbst

+0

Я подписался на тему SNS, используя AWS SDK, а затем загрузите файл. – kixorz

+0

Спасибо за ответ. Я до сих пор не понимаю, какой протокол можно использовать в подписке. Можно создать, например. подписку на электронную почту для некоторого пользователя через SDK, но это не будет уведомлять экземпляр EC2, когда SNS отправляет новое уведомление. http://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html – einSelbst

1

Итак, если вы новичок на Lambda, сначала вам нужно знать, что вы можете поместить свой собственный код непосредственно в командной строке функции Lambda или вы можете загрузите ZIP-файл, содержащий вашу функцию. Второй - тот, который мы будем использовать для получения копии с s3 на ваш EC2.

¿Почему мы загрузим файл .zip с помощью функции? Потому что таким образом мы можем установить все зависимости, которые нам нужны и чего хотят.

Теперь, чтобы это стало возможным, прежде всего, ваша лямбда-функция должна подключаться к вашему экземпляру EC2 через SSH. После этого вы можете выполнить некоторые командные строки, чтобы загрузить файл S3, который вы хотите.

Так поместить этот код в лямбда-функции (внутри exports.handler ....) и установить зависимость простой SSH с «НПМ установить простой-SSH»

// imagine that the input variable is the JSON sended from the client. 
//input = { 
    //s3_file_path : 'folder/folder1/file_name', 
    //bucket  : 'your-bucket', 
//}; 

// Use this library to connect easly with your EC2 instance. 
var SSH = require('simple-ssh'); 
var fs = require('fs'); 

// This is the full S3 URL object that you need to download the file. 
var s3_file_url = 'https://' + input.bucket + '.s3.amazonaws.com/' + input.s3_file_path; 


/**************************************************/ 
/*      SSH      */ 
/**************************************************/ 
var ssh = new SSH({ 
    host: 'YOUR-EC2-PUBLIC-IP', 
    user: 'USERNAME', 
    passphrase: 'YOUR PASSPHRASE', // If you have one 
    key : fs.readFileSync("../credentials/credential.pem") // The credential that you need to connect to your EC2 instance through SSH 
}); 

// wget will download the file from the URL we passed 
ssh.exec('wget ' + s3_file_url).start(); 

// Also, if you wanna download the file to another folder, just do another exec behind to enter to the folder you want. 
ssh.exec('cd /folder/folder1/folder2').exec('wget ' + s3_file_url).start(); 

Для этого, чтобы работать, вы должны убедиться, что ваша машина EC2 имеет разрешенные разрешения, чтобы ее можно было ввести через SSH.