使用Fargate来实现Rails、ALB、RDS、CodeDeploy(蓝/绿部署)和Github Actions的自动更新
使用Rails与Fargate
我所制作的东西
仓库
-
- 创建ALB(公共子网1和2),Fargate(私有子网1和2),DB(私有子网1和2)的安全组并限制访问
-
- Fargate(蓝/绿更新)
-
- Github Actions(部署)
构建Docker镜像
推送到ECR
创建Fargate任务定义
蓝/绿更新
deploy_stack.sh(用于CloudFormation)
子网
-
- 公有子网1(可用区:a)
-
- 公有子网2(可用区:d)
-
- 私有子网1(可用区:a)
- 私有子网2(可用区:d)
安全组
-
- ALB Security Group => ALB安全组
-
- Service Security Group => 服务安全组,仅允许来自安全组的访问
-
- DB Security Group => 数据库安全组,仅允许来自服务安全组的访问
- Endpoint Security Group => 终端安全组,在创建Fargate时访问ECR并用于日志记录,仅允许来自服务安全组的访问
Fargete 创建了一个用于端点的选项。
-
- ecr.api(PrivateSubnet) – ECR API(私有子网)
-
- ecr.dkr(PrivateSubnet) – ECR 购买要点(私有子网)
-
- log(PrivateSubnet) – 日志(私有子网)
- S3(Gateway) – S3 存储(网关)
请参考亚马逊 ECR 接口 VPC 终端节点(AWS PrivateLink)。
我是
- 使用GithubActionsRole(OIDCProvider),无需使用秘钥。
部署
AWS部署脚本的参考文件为:aws/deploy_stack.sh。
创建S3模板保存位置(仅首次)。
aws s3 mb s3://soda-2022-08 --profile default --region ap-northeast-1
云架构部署
aws cloudformation package \
--template-file aws/main.yml \
--s3-bucket soda-2022-08 \
--output-template-file .aws/artifact.yml \
--profile default \
--region ap-northeast-1
aws cloudformation deploy \
--template-file .aws/artifact.yml \
--stack-name soda-demo \
--capabilities CAPABILITY_NAMED_IAM \
--profile default \
--region ap-northeast-1
将ECR推送
在创建Fargate之前,需要先执行上面的CloudFormation。
aws ecr get-login-password \
--region ap-northeast-1 \
--profile default |
docker login \
--username AWS \
--password-stdin XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t soda-2022-08 .
docker tag soda-2022-08:latest XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/soda-2022-08:latest
docker push XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/soda-2022-08:latest
获取ALB的DNS名称
如果顺利创建完成,应该会显示出来。
aws cloudformation describe-stacks \
--stack-name soda-demo |
jq -r '.Stacks[].Outputs[] |
select(.OutputKey == "ALBEndpoint") |
.OutputValue'
GitHub行动
在secrets中添加AWS_ROLE_ARN(GithubActionsRoleArn)。
aws cloudformation describe-stacks \
--stack-name soda-demo |
jq -r '.Stacks[].Outputs[] |
select(.OutputKey == "GithubActionsRoleArn") |
.OutputValue'
RDS PostgreSQL 版本
$ aws rds describe-db-engine-versions --engine postgres --query 'DBEngineVersions[].[DBEngineVersionDescription,EngineVersion,Status]' --output table
-----------------------------------------------
| DescribeDBEngineVersions |
+----------------------+--------+-------------+
| PostgreSQL 10.17-R1 | 10.17 | available |
| PostgreSQL 10.18-R1 | 10.18 | available |
| PostgreSQL 10.19-R1 | 10.19 | available |
| PostgreSQL 10.20-R1 | 10.20 | available |
| PostgreSQL 11.12-R1 | 11.12 | available |
| PostgreSQL 11.13-R1 | 11.13 | available |
| PostgreSQL 11.14-R1 | 11.14 | available |
| PostgreSQL 11.15-R1 | 11.15 | available |
| PostgreSQL 12.7-R1 | 12.7 | available |
| PostgreSQL 12.8-R1 | 12.8 | available |
| PostgreSQL 12.9-R1 | 12.9 | available |
| PostgreSQL 12.10-R1 | 12.10 | available |
| PostgreSQL 13.3-R1 | 13.3 | available |
| PostgreSQL 13.4-R1 | 13.4 | available |
| PostgreSQL 13.5-R1 | 13.5 | available |
| PostgreSQL 13.6-R1 | 13.6 | available |
| PostgreSQL 14.1-R1 | 14.1 | available |
| PostgreSQL 14.2-R1 | 14.2 | available |
+----------------------+--------+-------------+
ALB的健康检查没有通过。
只需提供一种选项:
解决方法 => 不使用HostAuthorization
config.middleware.delete ActionDispatch::HostAuthorization ;
config.middleware.delete 路由授权来宾 。
互相配合:Rails6的ActionDispatch::HostAuthorization与ELB的健康检查
滚动更新
在第二个任务启动后的5到6分钟后,第一个任务停止。
当有两个任务时,它们将按顺序显示(也可能是随机显示)。
请将gitignore文件加以考虑
- 垃圾箱/
bundle exec rake app:update:bin
- 配置/主键
将RAILS_MASTER_KEY进行配置.
蓝色/绿色 sè/lǜ sè)
由于CloudFormation现在可以进行ECS的蓝/绿部署,所以我们来尝试一下。
公式称,如果从CloudFormation执行蓝/绿部署是可行的,但有许多限制,使其难以使用。
使用AWS CloudFormation通过CodeDeploy来执行ECS的蓝/绿部署。
看起来受到了许多限制,难以使用。
使用 CloudFormation 管理 ECS 的蓝/绿发布时需要考虑的问题
-
- ECSタスク定義もしくはECSタスクセットと同時に、他のリソースの変更できない
-
- 動的な参照を使用してParameter StoreやSecrets Managerなどの外部サービスから値を取得できない
-
- 進行中のグリーンデプロイをキャンセルするには、CodeDeploy または ECS ではなく、CloudFormation でスタックの更新をキャンセル
-
- 出力値の宣言や他のスタックからの値のインポートはできない
- ネストされたスタックリソースを使用できない
你可以自己定义CodeDeploy,这样就可以了吗?
如果使用aws-actions/amazon-ecs-deploy-task-definition,似乎可以实现所期望的功能。
DeploymentGroup不支持ECS的问题。
对于蓝/绿部署,AWS CloudFormation仅支持在Lambda计算平台上进行部署。您可以使用AWS::CodeDeploy::BlueGreen挂钩来执行Amazon ECS蓝/绿部署。有关更多信息,请参阅通过AWS CloudFormation使用CodeDeploy执行Amazon ECS蓝/绿部署。
AWS::CodeDeploy::DeploymentGroup可以被理解为AWS代码部署的部署组。
听说还有一种方法是结合使用 cli 并努力。
只需要一个选择,翻译以下内容的中文同义句:
运行在us-east-1
我也在us-east-1进行了测试,成功地部署了我的CFN堆栈,并使用DeploymentGroup。
在ap-northeast-1地区也可以运行。
更新服务
需要通过CodeDeploy来更新Fargate Service,否则会出现CloudFormation更新失败。
Unable to update task definition on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment.
成本
RDS: 数据库. t4g. 微型
CPU(Fargate): 512
内存(Fargate): 1024