【问题标题】:How to copy a file from S3 to EC2 instance using AWS Lambda function?如何使用 AWS Lambda 函数将文件从 S3 复制到 EC2 实例?
【发布时间】:2016-12-07 04:58:10
【问题描述】:

我是 AWS lambda 的新手。我的问题是, 我在 Jenkins 中有一个 RPM(托管在 AWS 中),它使用“S3 工件”插件将副本复制到 S3 存储桶。我必须将此 RPM 从 S3 存储桶复制到其他 EC2 实例。 Lambda 函数从 Jenkins 复制到 S3 后,有什么方法可以触发 S3 将 RPM 文件从 S3 复制到 Ec2?

      s3-plugin          lambda   

Jenkins--------------->S3------------>Ec2

【问题讨论】:

    标签: jenkins amazon-s3 continuous-integration continuous-deployment aws-lambda


    【解决方案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 进入。

    【讨论】:

      【解决方案2】:

      简短的回答是否定的。 S3 本身无法在任何地方复制任何内容。

      正确的思考方式是 S3 可以发送可以启动 Lambda 函数的通知。然后,您的 Lambda 函数可以对该实例执行某些操作。看起来比较复杂。

      我将跳过使用 Lambda 并编写一个脚本,该脚本将直接从您的实例订阅 S3 存储桶通知 SNS 主题。此脚本会在将文件上传到 S3 后直接将其下载到您的实例。这个解决方案也是可扩展的,你可以有很多实例订阅这个主题等等。

      【讨论】:

      • 您能否详细说明您的脚本是如何工作的?通过 http 订阅?
      • 我会使用 AWS SDK 订阅 SNS 主题,然后下载文件。
      • 感谢您的回复。我仍然不明白订阅中可以使用哪种协议。可以创建例如。通过 SDK 为某些用户订阅电子邮件,但在 SNS 发送新通知时不会通知 EC2 实例。 docs.aws.amazon.com/sns/latest/api/API_Subscribe.html
      • SNS 主要通过 HTTP(长轮询)订阅。我会根据您编写文件下载脚本的语言来选择 SDK。
      猜你喜欢
      • 2021-02-10
      • 2021-05-31
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2017-09-03
      相关资源
      最近更新 更多