Pau*_*lor 5 tomcat amazon-web-services amazon-elastic-beanstalk
我目前有一个Elastic Beanstalk实例运行部署到Tomcat的Java应用程序.我使用Web界面部署应用程序,但应用程序使用web.xml中引用的数据文件(Lucene索引),通过ssh-ing到EC2并从我的S3存储桶获取数据文件,我将其复制到底层EC2实例.
到现在为止还挺好.
但是,如果我将EB更改为可自动缩放的环境,以便它根据需要自动创建新实例,那么这些EC2实例将没有数据文件,我该如何处理.
*更新*
我想我已经原则上解决了这个问题.我是从我的本地计算机上传我的应用程序,然后从亚马逊添加大数据文件.我需要做的是在我的数据处理EC2实例上构建我的战争,在某处将数据文件添加到war,然后将此战争放到S3上,然后当我创建我的EB时,我需要从S3存储桶加载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 repo的依赖项
<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>
Run Code Online (Sandbox Code Playgroud)
这是代码
@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 );
}
}
Run Code Online (Sandbox Code Playgroud)
*更新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*
所以可能的选择是
第三种选择似乎非常hacky,并非所有人都热衷于此,或者非常热衷于其他人.
*更新9**
我最终使用了ebextensions,不是太糟糕,我在这里记录以防万一
如果在src/main/resources中使用maven create folder ebextensions将以下内容添加到pom.xml(在最后的战争中ebextensions出现在正确位置的sao)
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/ebextensions</directory>
<targetPath>.ebextensions</targetPath>
<filtering>true</filtering>
</resource>
</webResources>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
转到IAM控制台(https://console.aws.amazon.com/iam/home?#home)并将角色策略Power User附加到Elastic Beanstalk角色用户
部署您的应用程序
有多种方法可以实现这一目标。您不需要 ssh 到实例并复制文件。
我会推荐您的“更新 3”中的方法。
您可以将 Elastic Beanstalk 环境配置为在部署应用程序之前执行命令。您可以使用 ebextensions 来完成此操作。请阅读此处有关命令的文档。
.ebextensions本质上,您使用应用程序源中的名称创建一个文件夹。该文件夹可以包含一个或多个具有.config扩展名的文件。这些文件按照其名称的字典顺序进行处理。您可以使用 ebextensions 执行 shell 命令。例如,您可以执行以下操作:
commands:
02_download_index:
command: aws s3 cp s3://mybucket/test.txt test2.txt
Run Code Online (Sandbox Code Playgroud)
您需要首先在 EC2 实例上安装aws cli 。这可以再次使用类似于上面的命令来完成。有关如何使用捆绑安装程序安装 AWS CLI 的说明,请参阅此处。您可以运行多个命令。配置文件中的命令将按字典顺序执行,因此您可以将命令命名为等01_install_awcli。02_download_index
现在,如果您计划在 EC2 实例上使用 AWS CLI,您还需要凭证。如果您正在使用 IAM 实例配置文件(很可能是这样,如果没有在此处阅读相关内容)。您可以授予实例配置文件使用 IAM 访问 S3 对象的权限。这样,您的实例将具有与其关联的 IAM 实例配置文件,并且能够从 S3 下载文件。或者,您也可以使用环境属性直接获取 ACCESS_KEY_ID 和 SECRET_KEY,如下所示。
所有出现的新实例都应该执行 ebextensions 中的命令。因此,您的实例可以使用您想要的软件进行预配置。
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |