我是AWS lambda的新手。我的问题是, 我在Jenkins中有一个RPM(在AWS中托管),它使用' S3工件'来复制到S3存储桶。插入。我必须将此RPM从S3存储桶复制到其他EC2实例。 Lambda函数在从Jenkins复制到S3后,是否有任何方法可以触发S3将RPM文件从S3复制到Ec2?
{{1}}
詹金斯---------------> S3 -----------> EC2
答案 0 :(得分:1)
简短的回答是否定的。 S3本身无法复制任何地方。
思考这个问题的正确方法是S3可以发送可以启动Lambda函数的通知。然后,您的Lambda函数可以对实例执行某些操作。这似乎相当复杂。
我将跳过使用Lambda并编写一个脚本,直接从您的实例订阅S3存储桶通知SNS主题。此脚本将在上载到S3时直接将文件下载到您的实例。此解决方案也是可扩展的,您可以让许多实例订阅此主题等。
答案 1 :(得分:1)
因此,如果您是Lambda的新手,首先必须知道您可以将自己的代码直接放在Lambda函数命令行中,或者您可以上传包含您的函数的.zip文件。第二个是我们用来实现从s3到EC2的副本。
¿为什么我们要上传带有该功能的.zip文件? 因为通过这种方式,我们可以安装我们需要和想要的所有依赖项。
现在,为了实现这一点,首先,您的lambda函数需要通过SSH连接到您的EC2实例。之后,您可以执行一些命令行以下载所需的S3文件。
因此将此代码放入lambda函数(在exports.handler ....中)并使用“npm install simple-ssh”安装simple-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输入。