You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform使用本地ZIP包部署AWS Elastic Beanstalk Node.js应用

结论

无法完全跳过S3存储:AWS Elastic Beanstalk 底层设计强制要求应用版本的代码包必须存储在AWS S3服务中,官方没有提供直接上传本地ZIP包到EB而不经过S3的支持路径。
但你不需要手动管理S3桶、手动上传包,所有S3相关操作都可以通过Terraform自动完成,全程对使用者透明,不需要你提前做任何S3相关的手动操作。

修改后的配置方案

你只需要在现有代码基础上补充S3桶、S3对象两个资源,再关联到EB应用版本即可,完整可运行的配置如下:

resource "aws_iam_policy" "nodejs" {
  name        = "NodeJSPolicy"
  policy      = file("policy.json")
}

resource "aws_iam_role" "nodejs" {
  name               = "iam_for_eb" # 你之前命名为lambda,实际是给EB服务用的,建议修改
  assume_role_policy = file("assumerole.json")
}

resource "aws_iam_role_policy_attachment" "nodejs" {
  policy_arn = aws_iam_policy.nodejs.arn
  role       = aws_iam_role.nodejs.name
}

# 修正archive_file配置:如果../app是代码目录,要用source_dir,source_file仅适用于单个文件场景
data "archive_file" "package"{
  type        = "zip"
  source_dir  = "../app"
  output_path = "../build/package.zip"
}

# 新增:创建专用S3桶存储EB部署包
resource "aws_s3_bucket" "eb_deploy_bucket" {
  bucket = "你的自定义桶名,必须全局唯一"
  # 可选:配置生命周期规则自动删除30天前的旧部署包,节省存储成本
  lifecycle_rule {
    enabled = true
    expiration {
      days = 30
    }
  }
}

# 新增:自动将本地打包好的ZIP上传到S3桶
resource "aws_s3_object" "eb_app_package" {
  bucket = aws_s3_bucket.eb_deploy_bucket.bucket
  key    = "eb-nodejs-app/${data.archive_file.package.output_md5}.zip" # 用包的MD5作为文件名避免版本冲突
  source = data.archive_file.package.output_path
  etag   = data.archive_file.package.output_md5
}

resource "aws_elastic_beanstalk_application" "nodejs" {
  name        = "nodejs-app"
  description = "Noodle JP Application"
}

resource "aws_elastic_beanstalk_application_version" "nodejs" {
  name        = "v0.01"
  application = aws_elastic_beanstalk_application.nodejs.name
  # 补充:关联S3上的部署包
  source_bundle {
    bucket = aws_s3_bucket.eb_deploy_bucket.bucket
    key    = aws_s3_object.eb_app_package.key
  }
}

resource "aws_elastic_beanstalk_environment" "nodejs" {
  application         = aws_elastic_beanstalk_application.nodejs.name
  name                = "noodle-jp"
  solution_stack_name = "Node.js 14 AL2 version 5.4.6"
  version_label       = aws_elastic_beanstalk_application_version.nodejs.name # 关联到刚创建的应用版本
}
注意事项
  • 执行Terraform的账号/角色需要具备S3上传、EB相关操作的权限,和你代码中配置的EB服务角色权限分开,不要混淆
  • S3桶名必须全局唯一,不能和AWS全球所有用户的桶名重复,建议加上你的个人/团队标识前缀
  • 后续更新版本时只需要修改aws_elastic_beanstalk_application_version的name字段,Terraform会自动重新打包、上传、部署新版本

内容的提问来源于stack exchange,提问作者Kaguei Nakueka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:48:03