如何编写.NET Core应用部署至AWS Elastic Beanstalk的脚本
解决.NET Core应用通过AWS CodePipeline+CodeDeploy部署到Elastic Beanstalk的脚本配置问题
我之前也碰到过一模一样的困扰——不想依赖Visual Studio的AWS部署插件,纯靠CodePipeline+CodeDeploy完成.NET Core应用到EB EC2实例的部署。其实核心是利用CodeDeploy的appspec.yml配置和自定义部署钩子脚本,完全可以脱离VS工具实现自动化部署,给你一步步说清楚:
1. 根目录创建CodeDeploy的AppSpec配置文件
在你的.NET Core项目根目录新建appspec.yml文件,这个文件是CodeDeploy的核心配置,用来定义部署流程和文件复制规则。以下是适配Windows和Linux实例的示例:
Windows实例示例
version: 0.0 os: windows files: - source: ./publish destination: C:\inetpub\wwwroot\YourAppName hooks: BeforeInstall: - location: scripts/StopIISSite.ps1 timeout: 300 runas: Administrator AfterInstall: - location: scripts/DeployApp.ps1 timeout: 300 runas: Administrator ApplicationStart: - location: scripts/StartIISSite.ps1 timeout: 300 runas: Administrator
Linux实例示例
version: 0.0 os: linux files: - source: ./publish destination: /var/app/current hooks: BeforeInstall: - location: scripts/stop_app.sh timeout: 300 runas: root AfterInstall: - location: scripts/setup_permissions.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start_app.sh timeout: 300 runas: root
2. 编写部署钩子脚本
在项目根目录新建scripts文件夹,里面放对应操作系统的脚本文件:
Windows脚本示例(StopIISSite.ps1)
# 停止目标IIS站点 Stop-WebSite -Name "Default Web Site" # 停止应用池(可选) Stop-WebAppPool -Name "DefaultAppPool"
Windows脚本示例(DeployApp.ps1)
# 这里可以添加文件替换、配置文件注入等逻辑 # 比如替换appsettings.json里的数据库连接字符串 (Get-Content C:\inetpub\wwwroot\YourAppName\appsettings.json) -replace 'YOUR_DB_CONN_STRING', $env:DB_CONN_STRING | Set-Content C:\inetpub\wwwroot\YourAppName\appsettings.json
Windows脚本示例(StartIISSite.ps1)
Start-WebAppPool -Name "DefaultAppPool" Start-WebSite -Name "Default Web Site"
Linux脚本示例(stop_app.sh)
#!/bin/bash # 停止.NET Core应用服务 systemctl stop your-app.service
Linux脚本示例(setup_permissions.sh)
#!/bin/bash # 设置应用目录权限 chown -R ec2-user:ec2-user /var/app/current chmod -R 755 /var/app/current
Linux脚本示例(start_app.sh)
#!/bin/bash # 启动.NET Core应用服务 systemctl start your-app.service
3. 调整CodePipeline构建阶段的输出
确保你的CodePipeline构建步骤(比如用CodeBuild)能正确生成.NET Core的发布包,并且把appspec.yml、scripts文件夹和publish目录一起打包成部署产物。比如在CodeBuild的buildspec.yml里添加:
phases: build: commands: - dotnet publish -c Release -o ./publish artifacts: files: - '**/*' base-directory: '.'
4. 配置CodeDeploy与Elastic Beanstalk的关联
- 确保你的EC2实例已经安装了CodeDeploy Agent(Windows和Linux的安装命令可以直接在AWS文档里获取,不用VS工具,也可以通过EB的
.ebextensions提前配置安装) - 在CodeDeploy里创建应用和部署组,部署组关联到你的Elastic Beanstalk环境的EC2实例
- 在CodePipeline的部署阶段选择CodeDeploy作为部署提供商,关联对应的应用和部署组
关键注意事项
- IAM权限:EC2实例的IAM角色需要包含
AmazonEC2RoleforAWSCodeDeploy权限,允许CodeDeploy Agent拉取部署包 - 运行时依赖:确保EB的EC2实例已经安装了对应版本的.NET Core Runtime,也可以在部署脚本里添加安装命令(比如Windows用
dotnet-install.ps1,Linux用yum/apt安装) - 脚本权限:Linux的脚本要添加可执行权限,比如在CodeBuild里执行
chmod +x scripts/*.sh
这样一套配置下来,就能完全脱离Visual Studio的AWS工具,实现从Git拉取代码、构建到部署到EB的全自动化流程了。
内容的提问来源于stack exchange,提问作者DariusVE
相关产品推荐
相关产品推荐

