我试过使用CircleCI将AWS ECR中的内容部署到ECS
你好。
这里是CircleCI 客户成功团队的千里。
最近我个人感到幸福的事情是,我做了一次Biryani(印度菜)。
在真正的海得拉巴,吃到Biryani成为了我的一个目标之一。
本次使用CircleCI,将从Amazon Elastic Container Registry (ECR)将部署到Amazon Elastic Container Service (ECS)。
参考 CircleCI 的文档《AWS ECR/ECS 部署步骤》。
準備的東西
-
- CircleCI アカウント
-
- AWSアカウント
-
- Terraform
- サンプルプロジェクト(クローンしておく) ― “CircleCI-Public/circleci-demo-aws-ecs-ecr”
安装Terraform
Terraform 是由 HashiCorp 公司提供的基础设施即代码(Infrastructure as Code, IaC)工具,可以安全高效地进行基础设施的构建、修改和版本管理。
请访问这个网页,在上面安装Terraform。
这次安装了 macOS 的开源版本。
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
设置CircleCI环境变量



环境变量的设定列表
AWS_ACCESS_KEY_ID
AWS のセキュリティ認証情報です。AWS_SECRET_ACCESS_KEY
AWS のセキュリティ認証情報です。AWS_DEFAULT_REGION
AWS CLI によって使用されます。AWS_ACCOUNT_ID
デプロイに必要です。 AWS アカウント ID はこちらで確認してください。AWS_RESOURCE_NAME_PREFIX
必須の AWS リソースのプレフィックスです。 terraform_setup/terraform.tfvars
の aws_resource_prefix
の値に対応する必要があります。AWS_ECR_REGISTRY_ID
ECR アカウントに関連づけられた 12 桁の AWS ID です。关于上述内容中的 AWS_DEFAULT_REGION,”设置CircleCI环境变量”页面中称之为 AWS_REGION,但这次我们将其称为 Config.yml 文件内的 AWS_DEFAULT_REGION,以与所述文件一致。
环境变量的值的确认方式


Terraform 文件的设置。
打开 ~/terraform_setup/terraform.tfvars 文件,为每个项目输入实际的值。请注意,这里需要输入实际的值而不是环境变量名。

创建 AWS 资源
按照以下步骤执行 Terraform。
cd terraform_setup
terraform init
terraform plan # プランをレビューします
terraform apply # プランを適用して AWS リソースを作成します
当达到最后,将显示以下信息。

当我查看AWS控制台时,我可以看到它被完美地创建了出来。


编辑 Config.yml 文件
这次,在这个项目中,我多次遭遇错误,开始考虑回乡一趟,此时一线希望出现在眼前。
这是CircleCI引以为豪的出色工程师们,包括Jasur、Kelvin和Jennings先生。
在他们的指导下,我们一起查看Config.yml文件,并对其中的一些描述进行了更改。
因此,我們將樣本項目進行如下更改。
並在更改處添加了注釋。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@8.2.1 # orbのバージョン変更
aws-ecs: circleci/aws-ecs@3.2.0 # orbのバージョン変更
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image: # build_and_push_image を build-and-push-imageに変更
repo: "${AWS_RESOURCE_NAME_PREFIX}" #account_url, regionの記述を削除
tag: "${CIRCLE_SHA1}"
- aws-ecs/deploy-service-update:
requires:
- aws-ecr/build-and-push-image # build_and_push_image を build-and-push-imageに変更
aws-region: AWS_DEFAULT_REGION # ${AWS_DEFAULT_REGION} を AWS_DEFAULT_REGIONに変更
family: "${AWS_RESOURCE_NAME_PREFIX}-service"
cluster: "${AWS_RESOURCE_NAME_PREFIX}-cluster" #cluster_name をclusterに変更
container-image-name-updates: "container=${AWS_RESOURCE_NAME_PREFIX}-service,image-and-tag=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${AWS_RESOURCE_NAME_PREFIX}:${CIRCLE_SHA1}"
verify-revision-is-deployed: true
post-steps:
- run:
name: Test the deployment
command: |
TARGET_GROUP_ARN=$(aws ecs describe-services --cluster ${AWS_RESOURCE_NAME_PREFIX}-cluster --services ${AWS_RESOURCE_NAME_PREFIX}-service | jq -r '.services[0].loadBalancers[0].targetGroupArn')
ELB_ARN=$(aws elbv2 describe-target-groups --target-group-arns $TARGET_GROUP_ARN | jq -r '.TargetGroups[0].LoadBalancerArns[0]')
ELB_DNS_NAME=$(aws elbv2 describe-load-balancers --load-balancer-arns $ELB_ARN | jq -r '.LoadBalancers[0].DNSName')
curl -s --retry 10 http://$ELB_DNS_NAME | grep "Welcome to nginx!"
顺便一提,以下是出现的错误的一部分。
请在这条信息中输入环境变量名,而不是环境变量的值。已删除${}部分。
Type error for argument region: expected type: env_var_name, actual value: "${AWS_DEFAULT_REGION}" (type string)
2. 找不到参数名为Cluster的信息,已将cluster_name改为cluster。
Error calling job: 'aws-ecs/deploy-service-update'
Missing required argument(s): cluster

总结
这次我们初次尝试将 CircleCI、AWS和Terraform 结合起来进行项目开发。在第37次构建中,终于取得了成功,这要归功于CircleCI的优秀工程师们,Jasur先生、Kelvin先生和Jennings先生的指导。非常感谢你们。
下次及以后,我真的很想挑战使用CircleCI、AWS和Terraform的项目。
如果您有关于CircleCI的问题,请随时联系支持中心进行咨询。