簡體   English   中英

如何在自動縮放的(多實例)Elastic Beanstalk(Tomcat)應用程序(AWS)中配置數據文件?

[英]How do I configure data files in a Autoscaled (multi-instance) Elastic Beanstalk (Tomcat) Application (AWS)?

我目前有一個Elastic Beanstalk實例,該實例運行一個已部署到Tomcat的Java應用程序。 我使用Web界面部署應用程序,但是該應用程序使用web.xml中引用的數據文件(Lucene索引),該數據文件通過ssh-ing到EC2並從我的S3存儲桶中獲取而復制到基礎EC2實例。

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

但是,如果我將EB更改為可自動縮放的環境,以便它根據需要自動創建新實例,則這些EC2實例將沒有數據文件,我該如何處理。

  1. 我可以在實際使用每個EC2實例之前使用數據文件對其進行預配置嗎?
  2. 我能否擁有每個服務器都可以引用的共享fs(數據文件是只讀的)?

*更新*

我認為我已經原則上得出了答案。 我是從本地計算機上載我的應用程序,然后稍后從Amazon添加大數據文件。 我需要做的是在我的數據處理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中更改root dir的大小,我可以嘗試更改為功能強大的實例,但這將不必要地增加成本,並且不清楚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 *

意識到micro EC2實例只能提供0.6GB而不是6GB的內存,我無論如何都需要更新到一台更大的計算機,它提供了兩個磁盤,因此我可以將壓縮文件復制到一個磁盤,然后成功地解壓縮到根磁盤,因此可以開始使用了。

*更新6 *

EB不尊重init()方法,因此在自動縮放的EB配置中,它啟動了其他EC2實例,並認為第一個實例實際上已經准備好時已過載。 而且我懷疑在真正繁忙的情況下,負載均衡器是否會啟動新的請求,因此負載平衡器會在准備好導致失敗的請求之前開始向這些實例提供請求。

*更新7 *

嘗試將索引直接放入WEB-INF /類中,並在web.xml中引用該位置。 這適用於本地測試Tomcat部署,但不幸的是EB在EB失敗,原因是抱怨EB似乎沒有重新初始化init()。 因此,與其嘗試在init()方法中從S3獲取索引,不如將索引直接放入WEB-INF / classes下的War文件中,並將我的web.xml中的參數指向那里。 盡管它們實際上不是類,但這對Tomcat不會造成問題,並且我已經針對本地tomcat安裝進行了部署測試,沒有問題。

不幸的是,將這個較大的war文件包含到S3的索引上載后,嘗試將其從S3位置部署到EB失敗,並且失敗:

無法啟動環境:源包為空或超過最大允許大小:524288000。

亞馬遜為什么要施加這種人為的限制?

*更新8 *

所以可能的選擇是

  • 伸展
  • Docker部署
  • 創建用於EB的自定義Amazon圖像

第三種選擇似乎很駭人,不是所有人都熱衷於此,或者不是真的很熱衷於其他選項。

*更新9 **

最終我將其與ebextensions一起使用,還不錯,我在這里記錄以防萬一

如果使用maven在src / main / resources中創建文件夾ebextensions,則將以下內容添加到pom.xml中(在最終戰爭中,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文件(我稱為mine 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 ),然后將角色策略超級用戶附加到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

您首先需要在EC2實例上安裝aws cli 可以再次使用類似於上面的命令來完成此操作。 此處提供有關如何使用捆綁的安裝程序安裝AWS CLI的說明。 您可以運行多個命令。 配置文件中的命令將按字典順序執行,因此您可以命名命令,例如01_install_awcli02_download_index等。

現在,如果您打算在EC2實例上使用AWS CLI,則還需要憑證。 如果您使用的是IAM實例配置文件(很可能是您,如果沒有在此閱讀有關內容)。 您可以授予實例配置文件權限,以使用IAM訪問S3對象。 這樣,您的實例將具有與之關聯的IAM實例配置文件,並能夠從S3下載文件。 另外,您也可以直接拿到ACCESS_KEY_ID和使用環境屬性SECRET_KEY如圖所示這里

出現的所有新實例都應在擴展名中執行命令。 因此,您的實例可以使用所需的軟件進行預配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM