如何在自动缩放(多实例)Elastic Beanstalk (Tomcat) 应用程序 (AWS) 中配置数据文件?

2024-01-12

我当前有一个运行部署到 Tomcat 的 Java 应用程序的 Elastic Beanstalk 实例。我使用 Web 界面部署应用程序,但应用程序使用 web.xml 中引用的数据文件(Lucene 索引),我通过 ssh-ing 到 EC2 并从 S3 存储桶获取数据文件将其复制到底层 EC2 实例。

到目前为止,一切都很好。

但是,如果我将 EB 更改为可自动扩展的环境,以便它根据需要自动创建新实例,那么这些 EC2 实例将没有数据文件,我该如何处理这个问题。

  1. 我可以在实际使用每个 EC2 实例之前使用数据文件对其进行预配置吗?
  2. 我可以有一个每个服务器都可以引用的共享文件系统(数据文件是只读的)吗?

* 更新 *

我想我已经从原则上找到了答案。我从本地计算机上传应用程序,然后从亚马逊添加大型数据文件。我需要做的是在我的数据处理 EC2 实例上构建我的战争,将数据文件添加到战争中的某个位置,然后将此战争放到 S3 上,然后当我创建 EB 时,我需要从 S3 存储桶加载 WAR。

所以只需要弄清楚数据文件在 War 中应该放在哪里以及如何通过 Maven 构建过程来创建。

*更新2*

实际上,不清楚数据文件到底应该放在 WAR 文件中,我看不到将它们放在哪里,并且应用程序希望它们是真实的文件,因此如果包含在 WAR 中并且 WAR 没有扩展/解压缩(我不知道EB)做什么应用程序无论如何都不会工作。

*更新3*

我当然可以将数据放入 S3 中(事实上它可能会在那里开始)所以我想知道在服务器初始化时我是否可以获取 s3 数据并将其放在某个地方然后使用它? 请指导。

*更新4*

因此,使用 s3 的想法,我几乎可以让它工作,在 servlet init() 方法中,我获取压缩文件,将其保存到当前工作目录(/usr/share/tomcat7/),然后解压缩它。问题是压缩文件为2.7GB,解压缩后的文件夹为5GB,EB使用的小实例提供8GB,其中使用了2GB。所以我有 6GB 足够的空间用于未压缩的文件,但不能保存压缩文件然后解压缩它,因为在解压缩过程中我需要 2.7 GB + 5 GB。

我将压缩版本加载到S3,因为原始数据不是单个文件,而是一个充满文件的文件夹,很难作为文件列表进行管理。我无法更改 EB 中根目录的大小,我可以尝试更改为功能强大的实例,但这会不必要地更加昂贵,并且不清楚 ECB 使用的实例提供了哪些磁盘空间。有任何想法吗 ?

这些是我添加到我的 Maven 存储库中的依赖项

  <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.rauschig</groupId>
        <artifactId>jarchivelib</artifactId>
        <version>0.6.0</version>
    </dependency>

这是代码

@Override
public void init()
{
        try
        {
            log.severe("Retrieving Indexes from S3");
            AWSCredentials credentials      = new BasicAWSCredentials("***********", "***********");
            AmazonS3Client ac = new AmazonS3Client(credentials);

            log.severe("datalength-testfile:"+ac.getObjectMetadata("widget","test.txt").getContentLength());
            File testFile = new File("test.txt");
            ac.getObject(new GetObjectRequest("widget", "test.txt"), testFile);
            log.severe("datalength-testfile:retrieved");

            log.severe("datalength-largefile:"+ac.getObjectMetadata("widget","indexes.tar.gz").getContentLength());
            File largeFile = new File("indexes.tar.gz");
            ac.getObject(new GetObjectRequest("widget", "indexes.tar.gz"), largeFile);
            log.severe("datalength-largefile:retrieved");
            log.severe("Retrieved Indexes from S3");

            log.severe("Unzipping Indexes");
            File indexDirFile = new File(indexDir).getAbsoluteFile();
            indexDirFile.mkdirs();
            Archiver archiver = ArchiverFactory.createArchiver(largeFile);
            archiver.extract(largeFile, indexDirFile);
            log.severe("Unzipped Indexes");


        }
        catch(Exception e)
        {
            log.log(Level.SEVERE, e.getMessage(), e );
        }
}

*更新5*

意识到微型 EC2 实例仅提供 0.6GB 而不是 6GB 后,我无论如何都需要更新到一台更大的机器,并且它提供了两个磁盘,这样我就可以将压缩文件复制到一个磁盘,然后成功解压缩到根磁盘,所以准备好了。

*更新6*

EB 不尊重 init() 方法,因此在自动缩放的 EB 配置中,它会启动其他 EC2 实例,并相信第一个实例已过载,而实际上它刚刚准备好。我怀疑,如果在真正繁忙时启动新的实例,负载均衡器将在这些实例准备好之前开始向这些实例提供请求,从而导致请求失败。

*更新7*

尝试将索引直接放入 WEB-INF/classes 并引用 web.xml 中的该位置。这适用于本地测试 Tomcat 部署,但不幸的是在 EB 中失败,因为抱怨 所以看来 EB 不尊重 init()。因此,我没有尝试在 init() 方法中从 S3 获取索引,而是将索引直接放入 WEB-INF/classes 下的 War 文件中,并将 web.xml 中的参数指向那里。尽管它们实际上不是类,但这不会对 Tomcat 造成问题,并且我已经针对本地 Tomcat 安装进行了部署测试,没有出现任何问题。

不幸的是,将包含索引的较大 war 文件上传到 S3 后,尝试将其从 S3 位置部署到 EB 失败,并显示:

无法启动环境:源包为空或超过允许的最大大小:524288000。

亚马逊为什么要施加这种任意限制?

*更新8*

所以可能的选择是

  • 电子扩展
  • Docker部署
  • 创建自定义 Amazon 映像以与 EB 一起使用

第三个选项似乎很老套,并不是所有人都热衷于此,或者真的非常热衷于其他选项。

* 更新 9 **

我最终让它与 ebextensions 一起工作,还不错,我在这里记录以防万一有用

如果使用 maven 在 src/main/resources 中创建文件夹 ebextensions 将以下内容添加到 pom.xml (sao ebextensions 在最终战争中出现在正确的位置)

            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>src/main/ebextensions</directory>
                            <targetPath>.ebextensions</targetPath>
                            <filtering>true</filtering>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

在 ebextensions 文件夹中创建 .config 文件(我称之为 copyindex.cfg),我的有此信息

commands:
   01_install_cli:
    command: wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip; unzip awscli-bundle.zip;  ./awscli-bundle/install -b ~/bin/aws

   02_get_index:
     command:
       aws s3 cp --region eu-west-1 s3://jthink/release_index.tar.gz /dev/shm/release_index.tar.gz;
       cd /usr/share/tomcat7; tar -xvf /dev/shm/release_index.tar.gz

转到 IAM 控制台(https://console.aws.amazon.com/iam/home?#home https://console.aws.amazon.com/iam/home?#home) 并将角色策略高级用户附加到 Elastic Beanstalk 角色用户

部署您的应用程序


有多种方法可以实现这一目标。您不需要 ssh 到实例并复制文件。

我会推荐您的“更新 3”中的方法。

您可以将 Elastic Beanstalk 环境配置为在部署应用程序之前执行命令。您可以使用 ebextensions 来完成此操作。阅读有关命令的文档here http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-commands.

本质上,您创建一个名为的文件夹.ebextensions在您的应用程序源中。该文件夹可以包含一个或多个文件.config扩大。这些文件按照其名称的字典顺序进行处理。您可以使用 ebextensions 执行 shell 命令。例如,您可以执行以下操作:

commands:
  02_download_index: 
    command: aws s3 cp s3://mybucket/test.txt test2.txt

您需要安装aws cli http://aws.amazon.com/cli/首先在您的 EC2 实例上。这可以再次使用类似于上面的命令来完成。提供了有关如何使用捆绑安装程序安装 AWS CLI 的说明here http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html#install-bundle-other-os。您可以运行多个命令。配置文件中的命令将按字典顺序执行,因此您可以将命令命名为01_install_awcli, 02_download_index etc.

现在,如果您计划在 EC2 实例上使用 AWS CLI,您还需要凭证。如果您正在使用 IAM 实例配置文件(很可能是,如果没有阅读相关内容)here http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.html)。您可以授予实例配置文件使用 IAM 访问 S3 对象的权限。这样,您的实例将具有与其关联的 IAM 实例配置文件,并且能够从 S3 下载文件。或者,您也可以使用环境属性直接获取 ACCESS_KEY_ID 和 SECRET_KEY,如图所示here http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.managing.html.

所有出现的新实例都应该执行 ebextensions 中的命令。因此,您的实例可以使用您想要的软件进行预配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在自动缩放(多实例)Elastic Beanstalk (Tomcat) 应用程序 (AWS) 中配置数据文件? 的相关文章

随机推荐

  • OpenCV Mat 处理时间

    我想知道 OpenCV 函数的 src 源 和 dst 目标 使用不同的变量是否会对处理时间产生影响 我有下面两个函数 做同样的事情 public static Mat getY Mat m Mat mMattemp new Mat Img
  • Swift 2.0 中的 do { } catch 不会处理从这里抛出的错误

    更新 swift 2 0 后 我遇到了 do try catch 错误 如下图所示 我怎样才能解决这个问题 谢谢 该错误告诉您封闭的捕获并不详尽 这是因为自动生成的catch块只是捕获NSError对象 编译器无法判断是否有其他对象Erro
  • 变基以及变基推送提交意味着什么

    人们常说 您不应该对已经推送的提交进行变基 这可能意味着什么 To understand this we need to understand a bit about how git works A git repository is a
  • 如何使用 Jackson 和 Spring Boot 提供自定义反序列化器

    我有以下三个应用程序 项目1举行 业务逻辑 Spring Cloud Function 一个接口IDemo实体 项目2 AWS 特定的处理程序 一种实现IDemo实体 带有 DynamoDB 特定的注释 该项目基于Spring Boot 项
  • 如何在 chromedriver 中启用地理定位支持?

    我需要使用 Selenium 测试 JS 地理定位功能 并且我正在使用 chromedriver 在最新的 Chrome 上运行测试 现在的问题是 Chrome 提示我在测试期间启用地理定位 并且我不知道如何在运行时单击那个小栏 所以我拼命
  • Prolog:访问从父规则读取

    我想要一个特定的规则来读取 SWI Prolog 中的用户输入数据 例如 process do stuff read values do more stuff with X and Y here read values write Plea
  • 如何让自定义任务标签在 Eclipse 中工作?

    尝试了很多次 但我就是不知道如何在任务中定义自定义标签 我使用该对话框并创建了不同的内容 例如 TODO2 V2 或 TOVO 仅用于测试 但这些都不会扫描到任务 即使我做了类似 TODO2 或 源代码中的 V2 或 TOVO 我也尝试过重
  • 开始卡桑德拉——使用昆德拉?还有别的事吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在接触 Cassandra 我们没有人对这个特定平台有任何经验 但都是 JavaEE JPA 等方面经验丰富的开发人员 我遇到了 Kund
  • Pivotal Cloud Foundry 登录问题

    我有一个 PWS 帐户 安装 Cloud Foundry 命令行界面 CLI 后 我尝试从 Windows 命令提示符 CYGWIN 终端和 Gitbash 登录 在上述所有情况下 我都无法登录cf login 但如果我发出命令 我就可以登
  • Grails - 将 UUID 渲染为 JSON

    我使用 UUID 作为我的域类的生成器 当我将域对象呈现为 JSON 时 id 如下所示 id class java util UUID leastSignificantBits 7570618374586820490 mostSignif
  • 在IIS中托管asp.net core应用程序,以便从网络内的其他PC访问

    如何在 Windows IIS 中托管我的 Asp Net Core 1 2 或 2 1 Web 应用程序 以便能够从本地网络 或我的虚拟操作系统 中的其他 PC 访问它 我的电脑是桌面 Windows 10 Pro 不是 Win Serv
  • C++0x 标准中对导出关键字的最佳解释是什么?

    我知道在最初的C 0x标准中有一个功能叫做export 但我找不到这个功能的描述或解释 它应该做什么 另外 哪个编译器支持它 尽管标准 C 没有这样的要求 但某些编译器要求所有函数模板都需要在使用它的每个翻译单元中可用 实际上 对于这些编译
  • 如何关闭 PDF 文件并重新创建它? (使用中的文件)

    我有一个可以创建 PDF 文件的 Java 应用程序 例如 我从程序创建一个简单的文件 我已经构建了代码来打开该文件 所以我创建了该文件 我看到了它 然后就可以了 如果我想修改该文件 我必须关闭该文件然后重新创建它 如果我不关闭该文件 则会
  • Internet Explorer 内容插件中的可编写脚本的对象

    虽然浏览器帮助程序对象有很多指南 但我很难找到有关如何为内容插件 即嵌入在网站中 实现可编写脚本的对象 即除了主控件之外 的资源 为了避免误解 问题是关于插件对象可能返回到网站中的脚本的可脚本化对象 例如来自方法调用 虽然我猜想这些的一般可
  • WPF - DataGridComboBoxColumn 示例

    我有一个包含 2 列的数据网格 一列包含角色信息 另一列应有一个包含可用用户列表的组合框 组合框中的数据与第一列中的数据无关 组合框没有数据上下文 只有项目源 而且我似乎也无法使用绑定 这一事实让我感到困惑 对于表中的数据和组合框中的数据使
  • 为什么我更喜欢使用向量而不是双端队列

    Since 它们都是连续的内存容器 在功能方面 双端队列几乎拥有向量所拥有的一切 但更多 因为在前面插入效率更高 为什么有人会更喜欢std vector to std deque 中的元素deque are not内存中连续的 vector
  • Js粘贴文件大小大于输入文件

    我用paste处理一张图片 图片只有3 6m 但是粘贴后变成了23m document addEventListener paste function event var items event clipboardData event cl
  • Apache Spark:客户端和集群部署模式之间的差异

    TL DR Spark Standalone集群中 客户端部署方式和集群部署方式有什么区别 如何设置我的应用程序运行的模式 我们有一个包含三台机器的 Spark Standalone 集群 所有机器都装有 Spark 1 6 1 主机 也是
  • Paint.setStrokeJoin 不适用于 canvas.drawLines

    我正在尝试使用绘制折线图canvas drawLines 但线路似乎没有正确连接 据我了解使用Paint setStrokeJoin应该使用斜接连接 chartLinePaint new Paint Paint ANTI ALIAS FLA
  • 如何在自动缩放(多实例)Elastic Beanstalk (Tomcat) 应用程序 (AWS) 中配置数据文件?

    我当前有一个运行部署到 Tomcat 的 Java 应用程序的 Elastic Beanstalk 实例 我使用 Web 界面部署应用程序 但应用程序使用 web xml 中引用的数据文件 Lucene 索引 我通过 ssh ing 到 E