AWS Secrets Manager または環境変数を介して提供される、Amazon Elastic Container Service (Amazon ECS) コンテナエージェントのプライベートリポジトリ認証情報を更新したいと考えています。
簡単な説明
タスク定義または環境変数の Secrets Manager を使用して、Amazon ECS コンテナエージェントにプライベートリポジトリ認証情報を指定できます。
以下のいずれかのオプションを選択してください。
- Secrets Manager を使用してプライベートリポジトリの認証情報を提供する場合は、「Secrets Manager でプライベートリポジトリの認証情報を更新する」のセクションの手順に従います。
- インスタンスユーザーデータと環境変数を使用してプライベートリポジトリの認証情報を提供する場合は、「環境変数を使用してプライベートリポジトリの認証情報を更新する」のセクションの手順に従います。
注: コンテナインスタンスで認証情報をプレーンテキストで格納することは、セキュリティ上のベストプラクティスではありません。代わりに Secrets Manager を使用するのがベストプラクティスです。ただし、コンテナインスタンス内にレジストリ認証情報を格納することに直接アーキテクチャ上の依存関係がある場合を除きます。
解決方法
Secrets Manager でプライベートリポジトリの認証情報を更新する
1. Secrets Manager コンソールを開きます。
2. シークレットを選択してから、[Retrieve secret value★] を選択します。
3. [Edit★] を選択します。
4. プライベートレジストリ用に保存されている認証情報を更新し、[Save★] を選択します。
続行するには、「更新したプライベートリポジトリの認証情報をテストする」のセクションの手順に従います。
環境変数を使用してプライベートリポジトリの認証情報を更新する
1. コンテナインスタンスに接続します。
2. ECS コンテナエージェントに Docker の認証情報をどのように提供しているかを調べるには、次のコマンドを実行します。
$ cat /etc/ecs/ecs.config
このコマンドは /etc/ecs/ecs.config ファイルの内容を返します。
ECS_ENGINE_AUTH_TYPE 変数が docker に設定されている場合は、Docker 認証情報をプレーンテキストで直接 ECS コンテナエージェントに渡しています。このアプローチは避けるべきです。代わりに、Secrets Manager、または「新しい Docker 認証値を入手する」のセクションの dockercfg 形式アプローチを使用します。
ECS_ENGINE_AUTH_TYPE 変数が dockercfg に設定されている場合は、docker ログインコマンドが生成した Docker 生成の認証値によって Docker の認証情報を渡しています。このアプローチを続行するには、「新しい Docker 認証値を入手する」のセクションにある手順に従います。
新しい Docker 認証値を入手する
1. Docker にローカルでログインするには、次のコマンドを実行してから新しい認証情報を入力します。
$ docker login
2. config.json ファイルを連結するには、次のコマンドを実行してから Docker が生成した認証キー値をコピーします。
$ cat ~/.docker/config.json
3. ECS_ENGINE_AUTH_DATA 変数を更新するには、次のコマンドを実行します。
$ sudo vi /etc/ecs/ecs.config
4. vi エディターで、ECS_ENGINE_AUTH_DATA 変数の値をステップ 2 の Docker が認証したキー値に更新します。例:
ECS_CLUSTER=TestECSCluster
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth","a2vpdGhhd3M6UGFzc3dvcmQ="}}
続行するには、「ECS コンテナエージェントを再起動する」のセクションの手順に従います。
ECS コンテナエージェントを再起動する
1. ECS コンテナエージェントを再起動するには、コンテナインスタンスが実行中の Amazon マシンイメージ (AMI) に基づいて、次のいずれかのコマンドを実行します。
Amazon Linux ECS に最適化された AMI:
$ sudo stop ecs && sudo start ecs
Amazon Linux 2 ECS に最適化された AMI:
$ sudo systemctl restart ecs
注: ECS クラスター内の他のコンテナインスタンスにある /etc/ecs/ecs.config ファイルを更新するには、環境変数を使用してプライベートリポジトリの認証情報を更新するのセクションに戻ります。次に、各コンテナインスタンスの更新プロセスに従います。
続行するには、「更新したプライベートリポジトリの認証情報をテストする」のセクションの手順に従います。
更新したプライベートリポジトリの認証情報をテストする
次の手順では、クラスター全体に更新した画像をデプロイしていると仮定しています。
1. Amazon ECS コンソールを開きます。
2. ナビゲーションペインで [Clusters★] を選択してから、クラスターを選択します。
3. サービスを選択してから [Update★] を選択します。
4. [Force new deployment★] チェックボックスをオンにします。
5. [Minimum healthy percent★] に 50 と入力します。
6. セットアップウィザードの残りの手順を完了してから、[Update Service★] を選択します。
7. [View Service★] を選択します。
8. [Deployments★] タブで新しいデプロイを表示します。Amazon ECS は以前のデプロイの下でタスクを徐々に停止してから、新しい画像の取得を試みながら新しいデプロイの下でタスクを再開します。
注: ステップ 8 では、クラスターにローリングアップデートデプロイタイプを正常に実行するための十分なリソースがあることを前提としています。
9. [Tasks★] タブを選択し、個々のタスクとそのステータスを確認します。
タスクのステータスが [Running] (実行中) に設定されている場合、サービスはエラーなしでこのタスクを正常に更新しました。
タスクのステータスが [Running (CannotPullContainerError)] (実行中) に設定されている場合、サービスはこのタスクを更新しましたがエラーが発生しました。ECS コンテナエージェントは新しいコンテナイメージを取得できず、古いキャッシュイメージを使用しています。認証情報が更新されていることを確認し、別のサービスのデプロイ更新を実行します。
注: タスクの詳細をすべて表示し「プルアクセスが拒否されました」というエラーを表示するには、個々のタスクのステータスに対応するドロップダウンの矢印を選択します。例:
CannotPullContainerError: Error response from daemon: pull access denied for user/reponame, repository does not exist or may require 'docker login'
関連情報
Amazon ECS コンテナエージェントの設定
認証形式