如何在创建实例时将文件夹从 S3 复制到弹性 beanstalk 实例

Posted

技术标签:

【中文标题】如何在创建实例时将文件夹从 S3 复制到弹性 beanstalk 实例【英文标题】:How to copy folder from S3 to elastic beanstalk instance on instance creation 【发布时间】:2017-03-26 09:31:18 【问题描述】:

我正在 AWS Elastic Beanstalk 上运行一个 Django Web 应用程序,该应用程序需要特定的可用文件才能运行(实际上是一个 nltk 停用词语料库)。由于实例来来去去,我将所需的文件夹复制到由我的弹性 beanstalk 创建的 S3 存储桶中,并计划使用 awscli 将复制命令添加到我的弹性 beanstalk 配置文件中。但我无法让它工作。

我的 beanstalk 启动的实例应该对 S3 存储桶具有读取权限,因为这是 beanstalk 自动创建的存储桶。因此 beanstalk 还创建了一个 IAM 角色aws-elasticbeanstalk-ec2-role,这是一个附加到它启动的每个实例的实例配置文件。此角色包括AWSElasticBeanstalkWebTier 策略,该策略似乎授予对 S3 存储桶的读取和写入访问权限:


  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "BucketAccess",
      "Action": [
        "s3:Get*",
        "s3:List*",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::elasticbeanstalk-*",
        "arn:aws:s3:::elasticbeanstalk-*/*"
      ]
    
  ]
 

我尝试将以下命令添加到.ebextensions/my_app.config

commands: 
  01_copy_nltk_data:
    command: aws s3 cp s3://<my_bucket>/nltk_data /usr/local/share/

但当我尝试部署时出现以下错误,即使我可以在 S3 控制台中看到该文件夹​​

Command failed on instance. Return code: 1 Output: An error occurred (404) when calling the HeadObject operation: Key "nltk_data" does not exist

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

AWS Support 给出了答案:我的nltk_data 文件夹中有子文件夹和文件,因此aws s3 cp 命令需要--recursive 选项。

【讨论】:

以上是关于如何在创建实例时将文件夹从 S3 复制到弹性 beanstalk 实例的主要内容,如果未能解决你的问题,请参考以下文章

在弹性 beantalk 上构建战争文件时从 AWS S3 复制文件

如何在AWS中将Windows EC2实例复制到S3存储桶?

如何从 aws-sdk 中的 s3 存储桶创建 Elastic Beanstalk 实例?

弹性 beantalk 检索 S3 文件时权限被拒绝

如何将文件从 S3 复制到 Amazon EMR HDFS?

如何从 Elastic Beanstalk 实例访问 S3 存储桶中的 docker 配置文件