Upgrade to Pro — share decks privately, control downloads, hide ads and more …

あなたの組織に最適なコンテナデプロイ方法とは?〜ECSにおけるデプロイ最新機能てんこ盛り〜

 あなたの組織に最適なコンテナデプロイ方法とは?〜ECSにおけるデプロイ最新機能てんこ盛り〜

AWSにおけるコンテナワークロード運用のデファクトスタンダードの地位を確立したECS。 デプロイ方法も進化を続け、CodeDeployとALBで連携したB/Gデプロイやカナリアリリースにも対応し、そのデプロイにおける柔軟性はEKSに勝るとも劣りません。 そんなECSですが、手段が豊富になったこともあり現状「そもそもうちの組織としてどんなデプロイ方法が最適なのか?」を選択するのが難しくなっています。 このセッションでは、ECSのデプロイ機能を紹介しつつ、マルチアカウントでの運用、リリース承認プロセス、IaCとの連携方法、GitHub Actionsも含めた最新動向を全てお伝えいたします。

濱田孝治

July 03, 2020
Tweet

More Decks by 濱田孝治

Other Decks in Technology

Transcript

  1. #devio2020 タスク定義 17 ECSの構造解説(タスク定義、コンテナ定義) EC2 Fargate タスクメモリ タスクCPU or ⽣成

    コンテナ定義 イメージのURI ポートマッピング ヘルスチェック エントリポイント コマンド 作業ディレクトリ 環境変数 ログ設定 docker runで利⽤す るコマンドは⼀通り 利⽤可能
  2. #devio2020 クラスター サービス定義 サービス定義 サービス 18 ECSの構造解説(クラスター、サービス) 元ネタのタスク定義 タスクの数 デプロイ定義

    VPC、サブネット セキュリティグループ ALB(or NLB)定義 オートスケール設定 タスク タスク タスク タスク ・ ・ ・ ・ Application Load Balancer Amazon ECS タスク 定義 起動
  3. #devio2020 23 ECSへのデプロイのながれ タスク定義のイメージURIと、サービス定義のタスク定 義バージョンが変更されデプロイされる タスク定義 タスクメモリ タスクCPU コンテナ1 イメージのURI

    ポートマッピング ログ設定 コンテナ2 イメージのURI ポートマッピング ログ設定 サービス定義 ネットワーク VPC タスク定義 タスク定義バージョン オートスケール設定 新コンテナで デプロイ起動 ECR
  4. #devio2020 28 latest運⽤のメリット・デメリット メリット • デプロイにおいてタスク定義、サービス定義の更新が不要 • サービスの「新バージョンの強制デプロイ」で全て完結 デメリット •

    コンテナでエラー発⽣時、ソースコードとのトレーサビリ ティがとれない • どのバージョンが今本番環境で動いているのか確証がとれ ない • 適切なロールバック対処ができない
  5. #devio2020 36 ビルド部分の構成(Buildspec.yml) build: commands: - REPOSITORY_URI=${ECR_URI} - IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION} -

    docker build -t $REPOSITORY_URI:$IMAGE_TAG . post_build: commands: - docker push $REPOSITORY_URI:$IMAGE_TAG - echo "[{¥"name¥":¥"${CONTAINER_NAME}¥",¥"imageUri¥":¥"${REPOSITORY_U RI}:${IMAGE_TAG}¥"}]" > imagedefinitions.json artifacts: files: imagedefinitions.json
  6. #devio2020 37 ビルド部分の構成(Buildspec.yml) build: commands: - REPOSITORY_URI=${ECR_URI} - IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION} -

    docker build -t $REPOSITORY_URI:$IMAGE_TAG . ${ECR_URI} • プッシュ先ECRのURI。CodeBuildの環境変数で⾃分で設定 ${CODEBUILD_RESOLVED_SOURCE_VERSION} • CodeBuildのソースがGitリポジトリの場合に⾃動的に設定される 環境変数 • ソースコードリポジトリのコミットIDが格納される
  7. #devio2020 39 ビルド部分の構成(Buildspec.yml) - echo "[{¥"name¥":¥"${CONTAINER_NAME}¥",¥"imageUri¥":¥"${REPOSITORY_U RI}:${IMAGE_TAG}¥"}]" > imagedefinitions.json artifacts:

    files: imagedefinitions.json イメージ定義ファイル(imagedefinitions.json)の作成 ECSのタスク定義中のコンテナとECRのURIをマッピングする 情報 キー 値 例 name コンテナ名 php-container ImageURI imageUri 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/php- container:b5649704b0
  8. #devio2020 41 デプロイ部分の詳細 CodePipelineのデプロイステージで以下を設定 • Action provider︓ECS • Input artifacts︓BuildArtifact

    • デプロイ対象のECSクラスター、ECSサービス • イメージ定義ファイル名 キー 値 例 name コンテナ名 php-container ImageURI imageUri 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/php- container:b5649704b0
  9. #devio2020 42 デプロイ時の挙動 デプロイ設定とイメージ定義ファイルの内容で⾚字部分 だけが更新される タスク定義 タスクメモリ タスクCPU コンテナ1 イメージのURI

    ポートマッピング ログ設定 コンテナ2 イメージのURI ポートマッピング ログ設定 サービス定義 ネットワーク VPC タスク定義 タスク定義バージョン オートスケール設定 新コンテナで ローリングデプ ロイ起動 CodePipeline
  10. #devio2020 48 リファレンス • イメージ定義ファイルのリファレンス • https://docs.aws.amazon.com/ja_jp/codepipeline/lat est/userguide/file-reference.html#pipelines-create- image-definitions •

    CodeBuildのビルド仕様に関するリファレンス • https://docs.aws.amazon.com/ja_jp/codebuild/latest /userguide/build-spec-ref.html
  11. #devio2020 58 別の環境にコンテナをデプロイする⽅法2種 ①コードベースを同じにして再度ビルドする⽅法 • 開発環境にデプロイしたブランチから、ステージング、本 番環境⽤ブランチへマージしてプッシュ • 各環境⽤ブランチのプッシュをトリガーに対応する環境へ デプロイする⽅式

    ②テスト済みイメージを使い回す • 開発環境でテストしたイメージを使ってステージング環境、 本番環境にデプロイする ビルドするタイミングにより異なった イメージがビルドされる可能性有
  12. #devio2020 version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition:

    <TASK_DEFINITION> LoadBalancerInfo: ContainerName: "sample-website" ContainerPort: 80 68 ソース部分の構成(appspec.yml) <TASK_DEFINITION> • プレースホルダ。デプロイステージで⾃動的に対象のタスク定義 のバージョンに書き換わる
  13. #devio2020 69 ソース部分の構成(taskdef.json) ECSのタスク定義 <IMAGE1_NAME> • 最初にタスク定義を登録 したのち、イメージURI をプレースホルダとして おく

    • CodePipelineの中のデ プロイステージで⾃動的 にURIが変更されタスク 定義が更新される { "executionRoleArn": "arn:aws:iam::629895769338:role/ecsTas kExecutionRole", "containerDefinitions": [ { "name": "sample-website", "image": "<IMAGE1_NAME>", "essential": true, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 〜〜以下略〜〜
  14. #devio2020 73 デプロイ部分の詳細 CodePipelineのデプロイステージで以下を設定 • Action provider︓ECS(Blue/Green) • 利⽤するCodeDeployのApplication Nameと

    deployment group • task def SourceArtifact︓taskdef.json • AppSpec SourceArtifact︓appspec.yaml • Input artifact︓ソースステージのECRイメージ名 • Placeholder text in task definition︓IMAGE1_NAME
  15. #devio2020 78 ECS(Blue/Green)デプロイの制約① Blue/Greenデプロイを使⽤する場合、Auto Scaling はサポートされない • Blue/Greenでのデプロイ中にスケーリングしたとき、 ルーティングができるイメージが沸かない… •

    回避策として、サービスのデプロイ前後で、Auto Scaling グループのスケーリングプロセスを停⽌〜再開させる⽅法 あり • パイプラインのデプロイ前後でCodeBuildなどで application-autoscalingのregister-scalable-target、 APIを叩く
  16. #devio2020 83 ECSデプロイにおけるGitHub Actionsの魅⼒ AWS公式ActionsにECS関連のものが多い • configure-aws-credentials • AWSへアクセスするときの権限管理が簡単。最⾼ •

    amazon-ecr-login • ECRにログイン • amazon-ecs-render-task-definition • タスク定義にイメージURIを挿⼊ • amazon-ecs-deploy-task-definition • タスク定義をデプロイ
  17. #devio2020 94 解決案② タスク定義はプレースホルダを利⽤して管理し、アプリ ケーションデプロイサイクルにのせる • GitHub Actionsのamazon-ecs-render-task-definitionや、 CodeDeployのtaskdef.jsonを使うと、リポジトリにあるタ スク定義を元にして、デプロイサイクルのなかでイメージ

    URIを埋めることが可能 • イメージURI以外のタスク定義プロパティ(CPU、メモリ、 環境変数等)の変更も、アプリケーションデプロイと同じラ イフサイクルで本番環境にデプロイしていく