我试过使用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环境变量

Screenshot 2023-02-01 at 11.40.16.png
Screenshot 2023-02-01 at 11.43.50.png
Screenshot 2023-02-01 at 11.46.44.png

环境变量的设定列表

変数説明AWS_ACCESS_KEY_IDAWS のセキュリティ認証情報です。AWS_SECRET_ACCESS_KEYAWS のセキュリティ認証情報です。AWS_DEFAULT_REGIONAWS CLI によって使用されます。AWS_ACCOUNT_IDデプロイに必要です。 AWS アカウント ID はこちらで確認してください。AWS_RESOURCE_NAME_PREFIX必須の AWS リソースのプレフィックスです。 terraform_setup/terraform.tfvarsaws_resource_prefix の値に対応する必要があります。AWS_ECR_REGISTRY_IDECR アカウントに関連づけられた 12 桁の AWS ID です。

关于上述内容中的 AWS_DEFAULT_REGION,”设置CircleCI环境变量”页面中称之为 AWS_REGION,但这次我们将其称为 Config.yml 文件内的 AWS_DEFAULT_REGION,以与所述文件一致。

环境变量的值的确认方式

Screenshot 2023-02-01 at 12.16.46.png
Screenshot 2023-02-01 at 11.55.33.png

Terraform 文件的设置。

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

Screenshot 2023-02-03 at 13.24.42.png

创建 AWS 资源

按照以下步骤执行 Terraform。

cd terraform_setup
terraform init
terraform plan  # プランをレビューします
terraform apply  # プランを適用して AWS リソースを作成します

 

当达到最后,将显示以下信息。

Screenshot 2023-02-03 at 14.30.35.png

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

Screenshot 2023-02-03 at 14.10.08.png
Screenshot 2023-02-03 at 14.10.46.png

 

编辑 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

 

Screenshot 2023-02-03 at 14.01.30.png

 

总结

这次我们初次尝试将 CircleCI、AWS和Terraform 结合起来进行项目开发。在第37次构建中,终于取得了成功,这要归功于CircleCI的优秀工程师们,Jasur先生、Kelvin先生和Jennings先生的指导。非常感谢你们。

下次及以后,我真的很想挑战使用CircleCI、AWS和Terraform的项目。

如果您有关于CircleCI的问题,请随时联系支持中心进行咨询。

bannerAds