Amazon Elastic Container Service (Amazon ECS) コンテナエージェントで、AWS Secrets Manager または環境変数を使用して渡すプライベートリポジトリの認証情報を更新したいです。
簡単な説明
Amazon ECS コンテナエージェントにプライベートリポジトリ認証情報を渡すには、タスク定義で Secrets Manager を使用するか、環境変数を使用します。
注: 認証情報をコンテナインスタンスにプレーンテキストで保存することは、セキュリティ上おすすめしません。アーキテクチャ上の直接的な依存関係があり、コンテナインスタンス内にレジストリ認証情報を保存する必要がある場合以外は、代わりに Secrets Manager を使用してください。
解決策
Secrets Manager を使用してプライベートリポジトリの認証情報を更新する
次の手順を実行します。
- Secrets Manager コンソールを開きます。
- シークレットを選択し、[シークレット値の取得] を選択します。
- [編集] を選択します。
- プライベートレジストリに保存されている認証情報を更新し、[保存] を選択します。
- 「更新したプライベートリポジトリの認証情報をテストする」セクションの手順を実行します。
環境変数を使用してプライベートリポジトリの認証情報を更新する
次の手順を実行します。
- コンテナインスタンスに接続します。
- 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 login コマンドが生成した Docker 生成による認証値により、Docker の認証情報が渡されます。この方法を使用する場合は、「Docker の新しい認証値を取得する」セクションの手順を実行してください。
Docker の新しい認証値を取得する
次の手順を実行します。
-
Docker アカウントにローカルでログインするには、次のコマンドを実行し、新しい認証情報を入力します。
$ docker login
-
config.json ファイルを連結するには、次のコマンドを実行してから、Docker が生成した認証キーの値をコピーします。
$ cat ~/.docker/config.json
-
ECS_ENGINE_AUTH_DATA 変数を更新するには、次のコマンドを実行します。
$ sudo vi /etc/ecs/ecs.config
-
vi エディタで、ECS_ENGINE_AUTH_DATA 変数の値を Docker 認証キーの値に更新します。例
ECS_CLUSTER=TestECSCluster
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"a2vpdGhhd3M6UGFzc3dvcmQ=","email":"email@example.com"}}
-
「ECS コンテナエージェントを再起動する」セクションの手順を実行します。
ECS コンテナエージェントを再起動する
次の手順を実行します。
- ECS コンテナエージェントを再起動するには、コンテナインスタンスが実行している Amazon マシンイメージ (AMI) に応じて次のいずれかのコマンドを実行します。
Amazon Linux 2 ECS 最適化 AMI
$ sudo systemctl restart ecs
注: Amazon Linux 1 は、2023 年 12 月 31 日にサポート期間が終了しました。Amazon Linux AMI には、今後セキュリティアップデートやバグ修正は提供されません。詳細については、「Amazon Linux AMI のサポート期間終了に関する更新情報」を参照してください。
Amazon Linux ECS 最適化 AMI
$ sudo stop ecs && sudo start ecs
注: ECS クラスター内の他のコンテナインスタンスで /etc/ecs/ecs.config ファイルを更新するには、「環境変数を使用してプライベートリポジトリの認証情報を更新する」を参照してください。次に、各コンテナインスタンスの更新プロセスに従います。
- 「更新したプライベートリポジトリの認証情報をテストする」セクションの手順を実行します。
更新したプライベートリポジトリの認証情報をテストする
注: 次のテスト例では、更新したイメージがクラスター全体にデプロイされます。
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] を選択してから、該当するクラスターを選択します。
- サービスを選択し、[更新] を選択します。
- [新規デプロイを強制する] にチェックを入れます。
- [更新] を選択します。
- [デプロイ] タブで新しいデプロイをレビューします。Amazon ECS は、以前のデプロイのタスクを段階的に停止します。その後、Amazon ECS は ECS が新しいイメージのプルを試みるのと同時に、新しいデプロイでタスクを再開します。
注: EC2 起動タイプのタスクを使用する場合、クラスターにはデプロイタイプのローリングアップデートの正常な実行に十分なリソースが必要です。
- [タスク] タブを選択し、それぞれのタスクとそのステータスをレビューします。
新しいタスクのステータスが Running に設定されている場合、エラーは発生せず、サービスにより正常にタスクが更新されています。
新しいタスクの最終ステータスが Stopped | Task failed to start に設定されている場合、サービスがこのタスクを更新した後、エラーが発生しています。ECS コンテナエージェントは新しいコンテナイメージをプルできず、古いキャッシュイメージを使用しています。認証情報が更新されたことを確認してから、サービスデプロイの更新をもう一度実行してください。
注: タスクの詳細を完全に表示し、pull access denied エラーを確認するには、障害が発生したタスクの ID を選択します。[説明] ページの [コンテナ] で [Stopped] を選択します。
エラーメッセージの例
CannotPullContainerError: Error response from daemon: pull access denied for user/reponame, repository does not exist or may require 'docker login' (user/reponame に対するプルアクセスが拒否されました。リポジトリが存在しないか、'docker login' が必要です)
関連情報
Amazon ECS コンテナエージェントの設定
認証フォーマット