当前位置: 首页 > 知识库问答 >
问题:

如何在AWS中处理大型战争文件?

贺兴昌
2023-03-14

我做了什么?

使用JSP开发了一个Web应用程序,允许用户注册、登录并将文件上传到AWS S3。我正在使用Elastic Beanstalk将这个应用程序部署到aws,方法是上传应用程序的war文件。对于登录和注册模块,我使用了RDS,它运行良好。

问题

当我想上传文件到S3时,我需要在WEB app中使用AWS SDK jar及其支持的jar文件。当我完成开发部分并导出war文件时,它大约是75MB。所以问题是,如果我把任何东西改成app,我需要把这个大尺寸的war上传到aws。war文件的大小受AWS SDK的JAR文件的影响。

应对这种情况有哪些选择?

共有2个答案

陈欣荣
2023-03-14

使用Elastic Beanstalk部署部分(因此更小)war文件的步骤如下:

  1. 在使用的外部库中创建一个单独的包(例如dist-lib.zip
  2. 将此包上传到S3
  3. 为下载和提取EC2节点上的外部库创建弹性Beanstrok部署config文件
  4. 使用外部库创建war文件
  5. 像往常一样部署war文件

摘录自Web模块的build.gradle(从zip内的路径中删除版本号):

apply plugin: 'java-library-distribution'

distTar.enabled = false
distZip.enabled = hasProperty('dist') // 

def subPrjs = rootProject.subprojects.collect { it.name } - project.name

//...

distributions.main {
    contents.exclude subPrjs.collect { "$it*.jar" }
    contents.exclude "tomcat-embed-*"
    contents.exclude "tomcat-annotations-api-*"
    contents.exclude "spring-boot-starter-tomcat-*"
}

distZip {
    baseName += '-lib'
    version = null
    doLast {
        def f0 = archivePath;
        version = props.ver; // replace w/ your version number
        if (archivePath.exists()) {
            archivePath.delete()
        }
        f0.renameTo(archivePath.path)
    }
}

创建zip文件w/:gradle distZip-Pdist=true

从aws cli:aws s3 cp您的_模块/build/distributions/YOUR_模块-lib-YOUR_版本。zip s3://YOUR_BUCKET/dist/dist lib。邮政编码

我建议固定桶:

  1. 它不会为你产生额外的外部流量
  2. 如果出现问题,你不小心上传了一些敏感数据,它不会造成任何损害

在Amazon S3中安全存储私钥中描述了访问私有S3存储桶的配置详细信息。

在您的应用程序被复制到Tomcat的webapps之前,您需要以下文件来自动下载、提取外部库并将其添加到提取的war包中。

deploy/eb/app-res.config

Resources:
  # Use instance profile to authenticate to S3 bucket that contains the private key
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["elasticbeanstalk-us-east-1-169305339676"]
          roleName:
            "Fn::GetOptionSetting":
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role-dev"

files:
  # distribution libs
  /tmp/dist-lib.zip:
    mode: "000644"
    owner: tomcat
    group: tomcat
    authentication: "S3Auth"
    source: https://s3.amazonaws.com/YOUR_BUCKET/dist/dist-lib.zip

deploy/eb/dist-lib。配置

files:
  /opt/elasticbeanstalk/hooks/appdeploy/pre/10_lib_extr.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      rm -rf /tmp/dist-lib
      unzip  /tmp/dist-lib.zip -d /tmp/
      mv     /tmp/dist-lib/lib /tmp/deployment/application/ROOT/WEB-INF/lib 

另一部分来自build。web模块的gradle(子模块(子项目)类直接包含在web-INF/classes中):

apply plugin: 'war'

jar.enabled = false

def env = project.hasProperty('env') ? project.getProperty('env') : 'lcl' // profile: set w/ "-Penv=..."
def ebDirs = ["$rootDir/deploy/eb-$env", "$rootDir/deploy/eb", "$rootDir/deploy/eb/_nginx"] // env. specific config first

// ...

war {
    duplicatesStrategy = 'fail'
    //rootSpec.exclude subPrjs.collect { "**/$it*.jar" } // exclude subproject jars only
    rootSpec.exclude "**/*.jar" // exclude dependencies => they must be downloaded and extracted during deployment
    from(subPrjs.collect { project(":$it").sourceSets.main.output }) {
        duplicatesStrategy = 'exclude' // in case of one output dir for multiple sourceSets
        into "WEB-INF/classes"
    }
    from(ebDirs) {
        duplicatesStrategy = 'exclude' // in case of env. spec. config
        exclude "**/_*"
        into ".ebextensions"
    }
}

使用gradle v4对上述解决方案进行了测试。10.2和aws cli v1。16.44(包括创建电子商务和部署电子商务)。

宋臻
2023-03-14

使用Maven之类的构建工具。这将确保在服务器的本地maven存储库中下载依赖文件。因此,它可以减少项目的上传大小。这是官方的快速指南

 类似资料:
  • 问题内容: 我如何知道要从WAR中获取文件的文件参考。 WAR的结构为: WAR SRC -Model -Network structure WebContent META-INF WEB-INF LIB JSP位于WebContent下,我已将config.txt文件放在WebContent文件夹下,并尝试通过 BufferedReader in = new BufferedReader(new

  • 我们正在使用AWS SAM构建API。在CodeStar中的Lambda节点模板上构建。事情一直进展顺利,直到我们的模板。yml文件变得太大了。每当推送代码并且CloudFormation开始执行更改集并为SAMendpoint创建堆栈时,它就会失败并回滚到上一次成功构建。 似乎我们有太多的资源超过了每个堆栈的云形成限制。 我尝试拆分模板文件,并编辑构建规范来处理两个模板文件,执行两个AWS云形成

  • 我有以下装饰示例: 我正在努力与行:即使在阅读了很多装饰教程 > 如果我将*和**留在中,我会得到错误:但是为什么wrapper\u function1知道的参数?我就是看不见他们被交到哪里去了。这样的事情对我来说是有意义的 def decorator_function1(原始_函数,*args,**kwargs)):my_args=args my_kwargs=kwargs def wrappe

  • 问题内容: 我有一个很大的xml文件,其中包含许多子元素。我希望能够运行一些xpath查询。我尝试在Java中使用vtd- xml,但有时会出现内存不足错误,因为xml太大,无法容纳到内存中。是否有替代方法来处理如此大的xml。 问题答案: 尝试http://code.google.com/p/jlibs/wiki/XMLDog 它使用sax执行xpaths,而无需创建xml文档的内存表示形式。

  • 如何使war文件自动部署?服务器组件是glass乐于,数据库是在MySQL中创建的。我需要创建一个可执行文件来提取war文件吗?以及如何做到这一点?

  • 问题内容: 我正在使用Python脚本处理大型CSV文件(数以10M行的GB数)。 这些文件具有不同的行长,并且无法完全加载到内存中进行分析。 每行由脚本中的一个函数分别处理。分析一个文件大约需要20分钟,并且看来磁盘访问速度不是问题,而是处理/函数调用。 代码看起来像这样(非常简单)。实际的代码使用Class结构,但这是相似的: 鉴于计算需要共享的数据结构,使用多核在Python中并行运行分析的