このチュートリアルの例では,シンプルなアプリケーションを亚马逊EC2コンテナサービス(ECS)にデプロイします。次に,CircleCIを使用して,アプリの后続バージョンを自动的にビルド,テスト,デプロイします。使用されているテクノロジーを正しく确実に理解できるように,次の主な手顺を段阶的に行っていきます。

  1. セキュリティグループを作成する
  2. 1つのインスタンスでECSクラスタを作成する
  3. ECSタスク定義を作成する
  4. タスク定義を実行するサービスを作成する
  5. CircleCIクラスタのECSサービスに関連付けるAmazon Elastic负载均衡器(ELB)およびターゲットグループを作成して構成する
  6. CircleCIのでELB DNS名を使用してアプリケーションにアクセスする(动作することをテストするため)
  7. circleci / aws-ecr@6.2.0orbを使用してCircleCIを構成し,更新されたイメージをビルドしてAmazon Elastic容器注册(ECR)にプッシュする
  8. circleci / aws-ecs@0.0.11orbを使用してCircleCIを構成し,先ほど作成したクラスタに更新されたイメージをデプロイする

亚马逊ECSの利点を十分に理解するには,まず码头工人を理解する必要があります。このチュートリアルでは,多克尔とコンテナの知识が必要となります。さらに,継続的インテグレーションと継続的デプロイメント(CI / CD)の基本の理解している必要があります。次のセクションでは,使用するテクノロジーと用语の一部を说明します。

使用されるテクノロジーと用语の概要

  • ECSの概要: ECSはコンテナを管理する亚马逊网络服务(AWS)のクラウドコンピューティングサービスです。開発者は,アプリケーションプログラミングインターフェイス(API)呼び出しとタスク定義を通じて,クラスタと呼ばれるサーバーのグループで実行されるスケーラブルなアプリケーションデプロイおよび管理できます。基本的に,ECSはタスクスケジューラです。ECSが作成するタスクは,実行中の码头工人コンテナにマップされます。使用可能なリソースに基づいて,クラスタ内のリソースでタスクを実行する場所を決定します。码头工人が広く採用されていることから、他のコンテナテクノロジー(LXC、RKTなど)も利用できるようになっていますが、ECS は Docker コンテナでネイティブに動作するように設計されています。

  • タスク定義:タスク定義は,コンテナの実行方法を説明するレシピと考えることができます。コンテナに公開するポート,割り当てるメモリとCPU、コンテナを起動する码头工人イメージなどの情報がタスク定義に含まれます。この例のタスク定義では,1つのコンテナ,使用するイメージ,割り当てるCPUとメモリ,および公開するポートが設定されます。

  • タスク: ECSタスクは,タスク定義からインスタンス化された実行中のコンテナの単位です。これらは,同じインスタンスで一緒に実行される1 ~ N個のコンテナの論理グループです(Nは1 ~ 10の間で定義されます)。需要に応じて1つのタスク定義で複数のタスクを作成できます。

  • サービス: ECSサービスは,常にいくつかのタスクが常に実行されていることを保証するために使用されます。エラーが発生しタスクのコンテナが終了した場合,またはバックエンドのEC2インスタンスが失敗して置き換えられる場合,ECSサービスは失敗したタスクを置き換えます。クラスタを作成して,使用するCPU、メモリ,およびネットワークポートなど,サービスが十分なリソースを利用できるようにします。実行されている限り,どのインスタンスタスクが実行されるかは重要ではありません。サービスコンフィグは,タスク定義を参照します。サービスはタスクの作成を担当します。

  • クラスター:ECSクラスターは,単一のリージョン内にある(コンテナ)インスタンス(またはFargateではタスク)のグループですが,复数のアベイラビリティーゾーンにまたがる场合もあります.ECSは,これらのインスタンスへのスケーリングリクエストのスケジューリング,管理,および处理のロジックを处理します。また,CPUとメモリのニーズに基づいて各タスクを最适に配置する作业も不要になります。クラスタは多くのサービスを実行できます。制品の一部であるアプリケーションが复数ある场合,それらのいくつかを1つのクラスタに配置できます。これにより,利用可能なリソースを效率的に使用し,セットアップの时间を最小限に抑えることができます。

  • コンテナインスタンス:これは,亚马逊ECSコンテナエージェントを実行しているAmazon Elastic Compute Cloud (EC2)インスタンスです。IAMポリシーロールが明確に定義されており,クラスタに登録されています。亚马逊ECSでタスクを実行すると,EC2起動タイプを使用して,ユーザーのタスクがアクティブなコンテナインスタンスに配置されます。

  • CircleCI宝珠:宝珠は,プロジェクト间で共有できるCircleCIコンフィグのパッケージです.Orbsを使用すると,ジョブ,コマンド,および执行人から构成される単一のバンドルを作成して,相互に参照したり,CircleCIビルドコンフィグにインポートして独自のネームスペースで呼び出したりすることができます。

シンプルな转到アプリケーション

プロジェクトのディレクトリ构造は次のとおりです。

。├──.circleci│└──配置。yml├──├├md├──ecs-service。json├──主要。去└──任务定义。json 1目录,6个文件

完全なアプリケーションは,このリポジトリにあります。詳細を確認するには,お使いの端末で次の行を使用して,必要な場所にクローンを作成します。

美元git克隆https://github.com/daumie/circleci-ecs.git

Dockerfileのみについて作业する场合は,ここで見つけることができます。去アプリケーションのmain.goファイルはここにあります。

では,これらをまとめて実行していきましょう。最初に,AWSアカウントを作成してアクティブにします。次に,ローカルマシンに AWS CLI をインストールして設定します。AWS CLIを使用して,コマンドラインインターフェイスでAWSとやり取りします。

次に,AWSアカウントを作成したときに自動的に作成されるデフォルトの虚拟私有云(VPC)を使用します。利用できない場合は,次のコマンドを実行してデフォルトのVPCを作成できます。

美元aws ec2 create-default-vpc

次のコマンドを実行して,利用できるVPCがあることを確認します。

美元aws ec2 describe-vpcs

デフォルトのVPCがあることを確認したら,後で使用するセキュリティグループを作成しましょう。

美元AWS EC2创建安全组- 组的名字circleci-demo-sg——描述“圆CI演示安全组”

次に,ECSクラスターと关连するEC2インスタンスを作成します。circleci-demo-clusterクラスタを呼び出します。以前に作成したcircleci-demo-sgセキュリティグループを設定する必要があります。

  • クラスタ名:circleci-demo-cluster
  • EC2インスタンスタイプ: t2.medium
  • ネットワーキング:すべてのサブネットでデフォルトVPCを使用します。
  • セキュリティグループ(circleci-demo-sg)このIDを使用します。
  • コンテナインスタンス我ロール: ecsInstanceRole

数分间待ってから,コンテナインスタンスがcircleci-demo-clusterに正常に登录されたことを确认します。集群/我的集群の下のECS实例タブをクリックして,登録されていることを確認できます。

アプリケーションイメージを作成し,AWS ECRにプッシュする

码头工人イメージをローカルで作成し,ECRにプッシュします。

美元码头工人建造- tcircleci-ecs: v1步骤1/14:来自golang:最新的建设者--->be63d15101cb……

次の手順で,ECRにイメージリポジトリを作成します。circleci-demoという名前を付けます。

AWSアカウントには一意のIDが設定されます。次のコマンドの634223907656をそのIDに変更してください。リポジトリ名を取得したら,イメージを適切にタグ付けできるようになります。

美元docker标签circleci-ecs:v1 634223907656.dkr.ecr.eu-western2.amazonaws.com/circleci -demo:最新

認証情報ヘルパーを使用して,码头工人CLIのAWS ECRリポジトリを認証できます。次のコマンドを使用して認証します(必要に応じてリージョンを変更します)。

$ aws ecr get login -不包括电子邮件-地区eu-west-2 | bash

次に,イメージをECRリポジトリにプッシュします。

美元码头工人推634223907656. dkr.ecr.eu -西方- 2. - amazonaws.com/circleci -演示:最新

ECRレジストリにイメージができましたので,去アプリケーションを起動するブループリントになるタスク定義が必要です。プロジェクトのルートにあるtask-definition.jsonファイルには,次のコード行があります。

{“家庭”:“circleci-演示服务”,“containerDefinitions”:({“名称”:“circleci-演示服务”,“图像”:“634223907656.dkr.ecr.eu-west-2.amazonaws.com/circleci-demo:latest”,“cpu”:128,“memoryReservation”:128,“portMappings”:({“containerPort”:8080,“协议”:“tcp”}]“命令”:(主要“。/”]“必不可少”:真正的}]}

:ECRにプッシュしたイメージに変更することを忘れないでください。

次のコマンドを実行して,コマンドラインインターフェイスからタスク定義を登録します。

美元AWS ECS寄存器任务定义——cli-input-jsonfile://task-definition.json

タスク定义がECSコンソールに正常に登录されたことを确认します。

後でECSサービスに関連付けるELBとターゲットグループを作成する

ELBを作成しているのは,最終的に複数のコンテナ間でリクエストをロードバランシングし,去アプリケーションをテストのためにインターネットに公開するためです。このために,AWSコンソールを使用します。EC2控制台>负载平衡>负载平衡器に移動し,创建负载均衡器をクリックして,应用负载平衡器を選択します。

ロードバランサーを構成する

  • ロードバランサーにcircleci-demo-elbという名前を付けて,(apple)を選択します。
  • 听众で、HTTPプロトコルとポート80を使用するデフォルトのリスナーを使用します。
  • 可用性区域で,クラスタを作成したときに使用したVPCを選択し,必要なサブネットを選択します。

セキュリティを構成する

  • SSLを使用しないため,警告をスキップします。

セキュリティグループを构成する

  • circleci-demo-elb-sgという名前の新しいセキュリティグループを作成し,ポート80とソース0.0.0.0/0を开いて,外部からのすべてがポートで80 ELBにアクセスできるようにします。

ルーティングを構成する

  • ポート80を使用する新しいターゲットグループ名circleci-demo-target-groupを作成します。

ターゲットを登録する

  • ECSインスタンスを选択して,既存のターゲットを登录します。

レビュ

  • ロードバランサーの詳細を確認します。

circleci-demo-elb-sgセキュリティグループは,circleci-demo-elbロードバランサーのポート80を开きます。次に,ECSインスタンスに关连付けられたcircleci-demo-sgセキュリティグループがロードバランサーからのトラフィックを許可することを確認する必要があります。すべてのELBトラフィックがコンテナインスタンスにヒットできるようにするには,次を実行します。

美元aws ec2 authorize-security-group-ingress- 组的名字circleci-demo-sg——协议tcp——港口1-65535——source-groupcircleci-demo-elb-sg

EC 2コンソールから,セキュリティグループにこれらのルールが追加されたことを確認します。

インバウンドルール”><br></p>
       <p><img src=circleci-demo-target-groupグループのコンテナインスタンスに送信されるトラフィックはすべて许可されます。

サービスを作成する

次のステップは,circleci-演示服务タスク定義(task-definition.jsonファイルで定義)を実行するサービスを作成することです。プロジェクトのルートにあるECS-service.jsonファイルには,次のコード行があります。

{“集群”:“circleci-demo-cluster”,“名”:“circleci-演示服务”,“taskDefinition”:“circleci-演示服务”,“负载均衡器”:({“targetGroupArn”:“阿尔恩:AWS:elasticloadbalancing:欧盟 - 西2:634223907656:targetgroup / circleci-演示targetgroup / a5a0f047c845fcbb”,“containerName”:“circleci-演示服务”,“containerPort”:8080}]“desiredCount”:1,“角色”:“ecsServiceRole”}

circleci-demo-elbロードバランサーを作成するときに作成したtargetGroupArnを见つけるにはEC2控制台>负载平衡>目标群体に移動し,circleci-demo-target-groupをクリックします。これをコピーして,ECS-service.jsonファイルのtargetGroupArnにあるものと置き换えます。

次に,circleci-演示服务ECSサービスを作成します。

美元aws ecs创建服务——cli-input-jsonfile://ecs-service.json

ECSコンソールから,集群>circleci-demo-cluster>circleci-演示服务に移動し,任务タブを表示します。コンテナが実行されていることを确认します。


すべてが機能していることをテストする

旋度を使用して,ELBで公開されているDNSエンドポイントを確認します。

美元旋度circleci -演示elb - 129747675. -欧盟-西方- 2. - elb.amazonaws.com;回声你好世界!


ブラウザからも同じように確認できます。

CircleCIを構成して,ビルド,テスト,およびデプロイする

去アプリケーションをECSに正常にデプロイしたら,アップデートごとにアプリを再デプロイします.CircleCi球体を使用することにより,构成済みのコマンド,ジョブ,および执行人をコンフィグファイルにインポートでき,多くの时间を节约できます。これにより,AWSのデプロイに必要な的bashスクリプト作成の多くの労力が軽减され,コンフィグ内のコード行も大幅に削减されます.Orbsキーを使用して,このプロジェクトで次の球体を呼び出します。

  • circleci / aws-ecr@6.2.0:亚马逊のECRと连携してイメージをビルド,プッシュ,更新する球
  • circleci / aws-ecs@0.0.11:亚马逊のECSと连携して,更新されたイメージを以前に作成したクラスタに展开する球

orbは次の要素から構成されます。

  • コマンド
  • ジョブ:実行可能なコマンドまたはステップのセット
  • 遗嘱执行人:遗嘱执行人は,码头工人,マシン,macOSやその環境の他のパラメーターなど,ステップが実行される環境を定義します。

CircleCIを使用するには,ビルド,テスト,およびデプロイ操作を命令するためにCircleCIが使用するコンフィグファイルが必要です。このプロジェクトの場合,config.ymlファイルには次のコード行が含まれます。

版本:2.1球体:AWS-ECR:circleci / aws-ecr@6.2.0AWS-ECS:circleci / aws-ecs@0.0.11工作流:#登录AWS,构建并推送图像到Amazon ECRbuild_and_push_image:职位:-AWS-ECR /构建 - 推图像:帐户url:AWS_ECR_ACCOUNT_URLaws-access-key-id:AWS_ACCESS_KEY_IDAWS-秘密访问密钥:AWS_SECRET_ACCESS_KEYcreate-repo:真正的要使用的dockerfile名称。默认为Dockerfile。dockerfile:Dockerfile# AWS_REGION_ENV_VAR_NAME地区:AWS_DEFAULT_REGION# myECRRepository回购:$ {MY_APP_PREFIX}”# myECRRepoTag标签:CIRCLE_SHA1美元”-aws-ecs / deploy-service-update:要求:-AWS-ECR /构建 - 推图像aws-region:AWS_DEFAULT_REGION家庭:$ {} MY_APP_PREFIX -service”集群名称:$ {MY_APP_PREFIX}集群”container-image-name-updates:容器= $ {MY_APP_PREFIX}服务类型、标签= $ {CIRCLE_SHA1}’

GitHubとCircleCIを使用します。CircleCIアカウントがない場合は,アカウントを作成します。GitHubにサインアップします。CircleCIダッシュボードから添加项目をクリックし,表示されたリストからプロジェクトを追加します。

次の环境変数を追加します。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION
  • AWS_ECR_ACCOUNT_URL(在这个例子中,“634223907656.dkr.ecr.eu-west-2.amazonaws.com”)
  • MY_APP_PREFIX(在本例中为“circleci-demo”)

main.goファイルで次の行を変更します。

"你好,世界!"

"你好,世界! "现在更新CircleCI”に変更します。

変更をコミットしてGitHubにプッシュします。

次のコマンドを実行することで,変更が端末から適用されたことを確認できます。

$卷曲circleci-demo-elb-129747675.eu-west-2.elb.amazonaws.com;回声的Hello World!现在,随着CircleCI更新

ブラウザからも同じように確認できます。

結論

ここでは,シンプルなGOアプリケーションをビルドし,それをECRにデプロイしました。これで,テストをアプリケーションに追加して,ECSインスタンスを更新する前にそれらのテストに合格することを确认できます。このチュートリアルでは,基本的なアプリケーションを使用しましたが,これは多くの実际の状况で机能する成熟したデプロイメントパイプラインです。

さらに,CircleCI orbを使用すると,CircleCIコンフィグの記述が簡素化されるため,生産性が向上します。球体は共有できるため、作成済みのコマンド、ジョブ、および Executor をコンフィグファイルで繰り返し使用でき、時間を節約できます。Orbs の使用は CircleCI と ECS のデプロイに限定されません。宝珠レジストリで利用可能なorbの詳細なリストを確認し,クラウドプラットフォーム,プログラミング言語などに適合するorbを見つけることができます。


多米尼克Motuka氏はAndela社のDevOpsエンジニアであり,コンフィグ管理,CI / CD, DevOpsプロセスを活用した,AWSおよびGCPの本番環境へのデプロイのサポート,自動化,最適化について4年以上の実務経験があります。