使用Fargate来实现Rails、ALB、RDS、CodeDeploy(蓝/绿部署)和Github Actions的自动更新

使用Rails与Fargate

architecture.png

我所制作的东西

仓库

    1. 创建ALB(公共子网1和2),Fargate(私有子网1和2),DB(私有子网1和2)的安全组并限制访问

 

    1. Fargate(蓝/绿更新)

 

    1. Github Actions(部署)

构建Docker镜像
推送到ECR
创建Fargate任务定义
蓝/绿更新

deploy_stack.sh(用于CloudFormation)

子网

    1. 公有子网1(可用区:a)

 

    1. 公有子网2(可用区:d)

 

    1. 私有子网1(可用区:a)

 

    私有子网2(可用区:d)

安全组

    1. ALB Security Group => ALB安全组

 

    1. Service Security Group => 服务安全组,仅允许来自安全组的访问

 

    1. DB Security Group => 数据库安全组,仅允许来自服务安全组的访问

 

    Endpoint Security Group => 终端安全组,在创建Fargate时访问ECR并用于日志记录,仅允许来自服务安全组的访问

Fargete 创建了一个用于端点的选项。

    1. ecr.api(PrivateSubnet) – ECR API(私有子网)

 

    1. ecr.dkr(PrivateSubnet) – ECR 购买要点(私有子网)

 

    1. 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

cost.png
スクリーンショット 2022-08-10 18.32.45.png
广告
将在 10 秒后关闭
bannerAds