ECS
ECSを利用する理由
=> 変化に迅速に対応する
アプリケーションの開発へフォーカスする
ビジネスの差別化要因になるアプリケーション開発に集中することでより迅速にプロダクトの価値を高めることができる
要件に応じたインフラストラクチャの管理
アプリケーションの需要に応じてスケールアウトやスケールインが迅速に行えること
コンテナを選択する理由
コンテナではアプリケーションと依存関係などがコンテナイメージとしてパッケージングされており、ローカルや開発環境、本番環境で同じコンテナイメージを利用してコンテナが実行できる。
コンテナのデプロイやスケーリングを行うコンテナオーケストレーションが利用されている。
コンテナをどのように動かすのかあるべき姿を定義することで需要に合わせたコンテナの増減などを行ってくれる。
ECRへのpush
1.認証トークンを取得し、レジストリに対して Docker クライアントを認証します。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
注意: AWS CLI の使用中にエラーが発生した場合は、最新バージョンの AWS CLI と Docker がインストールされていることを確認してください。
2. 以下のコマンドを使用して、Docker イメージを構築します。一から Docker ファイルを構築する方法については、「こちらをクリック 」の手順を参照してください。既にイメージが構築されている場合は、このステップをスキップします。
docker build -t nginx-repo .
3. 以下のコマンドを使用して、Docker イメージを構築します。一から Docker ファイルを構築する方法については、「こちらをクリック 」の手順を参照してください。既にイメージが構築されている場合は、このステップをスキップします。
docker tag nginx-repo:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-repo:latest
4. 以下のコマンドを実行して、新しく作成した AWS リポジトリにこのイメージをプッシュします:
docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-repo:latest
ECSのタスク定義でコンテナを追加する際の設定
プライベートレジストリの認証
認証が必要なプライベートレジストリからイメージを取得する場合に指定する。ECRのプライベートリポジトリから取得する場合は不要。
ヘルスチェック
ECSが指定したコマンドを実行することでコンテナのヘルスチェックを実行する。ALB側のヘルスチェック機能とは異なる。
コンテナタイムアウト
タスク内に複数のコンテナがあり起動に依存関係を持たせる際の待ち時間を指定する。コンテナが1つしかない場合は設定不要。
ネットワーク設定
コンテナ内のネットワークを指定する。Fargateの場合はawsvpcモードとなり、このネットワーク設定はサポートされないため設定不要。
ECSサービス
ALBと連携してタスク動作をコントロールするもの
デプロイサーキットブレイカー
ローリングアップデート用の設定
ヘルスチェックの猶予期間
タスクが最初に開始された後、Amazon ECS サービススケジューラが異常な Elastic Load Balancing ヘルスチェックを無視する期間 (秒単位) 。
サービス作成中にエラーで停止。
CannotPullContainerError: pull image manifest has been retried 5 time(s): failed to resolve ref <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<リポジトリ名>:v1: failed to do request: Head "https://<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/v2/<リポジトリ名>/manifests/v1": dial tcp 10.0.248.239:443: i/o timeout
理由
タスク定義のタスクロールで、AWS管理ポリシーのAmazonECSTaskExecutionRolePolicyを設定したことが誤り。
タスクロールとタスク実行ロールの違い
◾️タスクロール
タスク実行して起動したコンテナがアクセスしたいAWSリソースの権限を管理
◾️タスク実行ロール
タスク実行時にアクセスしたいAWSリソースの権限を管理
ECRのエンドポイント
- com.amazonaws.region.ecr.dkr
- com.amazonaws.region.ecr.api
https://dev.classmethod.jp/articles/vpc-endpoints-for-ecs-2022/#toc-3
サービス作成中にエラー発生②
エラー内容
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp 3.112.64.17:443: i/o timeout. Please check your task network configuration.
調査内容
起こっている事象
ECRに対してリクエストを送れなくてエラーを吐いている
調査1:ネットワークの設定で外部にリクエストを送れない?
=> 問題なし。ECRへのVPCエンドポイントの設定など。
調査2:タスク実行ロールでECRに対してアクセスする権限がない?
=> 問題なし。デフォルトで付与されているAmazonECSTaskExcutionRolePolicyの中身を確認すると、ECRからコンテナイメージを取得する権限があった。
調査3: コンテナイメージをしてするURLが間違っている?
=> 誤っていた。タスク定義で指定するコンテナイメージのURLに誤記があった。
◼︎メリデメ
◼︎◼︎責任共有モデル
◼︎◼︎B/Gデプロイ
Blue/Greenデプロイが簡単にできるので、デプロイ前とデプロイ後の切り戻しをダウンタイムなしで切り替えることが可能。
ALBで検証用のリスナーを作成する。Greenデプロイ用に別のポートを開く。別のターゲットグループとして指定する。
Http:80がクライアント(Blue)で、Http:10080(Green)みたいな。
◼︎◼︎コンテナオーケストレーター(コンテナ管理者)とは
◼︎運用の流れ