如何通过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
相关产品推荐
相关产品推荐

