在ElasticBeanstalk上预部署脚本

时间:2017-08-16 18:44:37

标签: ruby-on-rails amazon-web-services elastic-beanstalk

我正在向AWS部署rails应用程序。其中一个gem具有依赖关系,并且在部署期间运行bundle install之前需要在服务器上安装某些文件。在我的.ebextensions文件中,我有以下内容

01-oracle_sdk:
    sources:
      /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-sdk-linux.x64-12.2.0.1.0.zip
  02-oracle-basic:
    sources:
      /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-basic-linux.x64-12.2.0.1.0.zip
  03-oracle_sql_plus:
    sources:
      /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
  04-container_commands:
    00_oracle_dir:
      command: "export LD_LIBRARY_PATH=/usr/lib/instantclient_12_1"

据我所知,这些都不是预先部署的。它尝试安装gem时失败,因为该目录不存在。当我SSH到实例时,LD_LIBRARY_PATH未设置,并且source命令没有下载和解压缩任何zip文件。

1)我的语法是否正确2)如何让这些命令执行PRE deploy / bundle install?

2 个答案:

答案 0 :(得分:2)

EB有一个特定的文件夹,您可以在其中执行脚本以运行预部署。我在.config中创建了一个.ebextensions文件,其中包含我希望在部署之前执行的bash命令。它会在"/opt/elasticbeanstalk/hooks/appdeploy/pre/中创建一个可以运行的文件

<强> 001_script.config

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/001_oracle.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      bash commands you want executed here
      ...
      ...

答案 1 :(得分:1)

首先, .ebextensions 是目录,而不是文件。在该目录中,您需要创建一个扩展名为.config的文件。

此外,YAML对空白非常敏感,因此您需要与间距保持一致。

请尝试这样做(我不是100%确定sources可以获取多个文件,但是 - 您可能需要制作三个单独的.config文件...)

<强> .ebextensions / 01-oracle.config

sources:
  /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-sdk-linux.x64-12.2.0.1.0.zip
  /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-basic-linux.x64-12.2.0.1.0.zip
  /usr/lib: https://s3-us-west-2.amazonaws.com/xyz/instantclient-sqlplus-linux.x64-12.2.0.1.0.zip

最后,以这种方式设置LD_LIBRARY_PATH变量将不起作用;它将在部署期间设置,但不会持久。您可以使用eb setenv从命令行设置环境变量,也可以从ElasticBeanstalk控制台的Configuration选项卡设置环境变量。

可以找到更多信息in the documentation