1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ECS]プライベートサブネットでパブリックレジストリのイメージを利用してタスクを起動する

Last updated at Posted at 2024-09-27

はじめに

閲覧ありがとうございます、NTTデータ先端技術の@S-takahashi1129です。

ECSでのサービス作成の際、インターネットを経由せずにパブリックレジストリのコンテナイメージを利用する手順が思ったより手こずってしまったので自分なりに手順をまとめます。

今回の構成イメージは以下です。パブリックレジストリはVPCエンドポイントによるアクセスが現状では非対応です。
VPCEを経由したパブリックレジストリ.PNG

VPCエンドポイントの作成

今回はプライベートサブネットからインターネットを経由せずECSを利用するので、VPCエンドポイントが必要です。

今回はFargateでホストされるECSタスクを利用するので、以下4つのVPCエンドポイントを作成します。
EC2でホストされる場合は必要なエンドポイントが違うようなので注意してください。

VPCエンドポイント 用途
com.amazonaws.region.ecr.dkr   Dockerレジストリに利用される(pushやpull等)
com.amazonaws.region.ecr.api   ECRのapi呼び出しに利用される
com.amazonaws.region.s3    S3へのアクセスに利用される(イメージの保存先)
com.amazonaws.region.logs   CloudWatchへログを送信する場合に利用される

Gateway型のS3エンドポイントを利用する場合はルートテーブルの設定をしてください。

VPCエンドポイントにアタッチするセキュリティグループではプライベートサブネットからのポート443のインバウンドトラフィックを許可してください。

また、コンテナのイメージはS3バケット
arn:aws:s3:::prod-<region>-starport-layer-bucket/*
に格納されるため、こちらへのアクセスが拒否されていないVPCエンドポイントポリシーであることも確認してください。

作成したVPCエンドポイントは以下の通りです。

VPCE.PNG

Pull Through cache(プルスルーキャッシュ)の設定

プルスルーキャッシュはパブリックレジストリのリポジトリをプライベートレジストリにキャッシュすることができるECRの機能です。

今回はプライベートサブネットのECSを使うため、プルスルーキャッシュによってプライベートレジストリにキャッシュされたパブリックレジストリのリポジトリをVPCエンドポイントで参照します。

なお、パブリックレジストリへのVPCエンドポイントによるアクセスは現在サポートされておらず、インターネットを経由しないアクセスはできないようです。

プルスルーキャッシュルールの追加

ECRのコンソールページへアクセスし、「Private registry」の「Settings」から
「Pull through cache」を選択し、ルールを追加します。

プルスルーキャッシュルール追加.PNG

まず、使いたいイメージがあるレジストリを指定します。
今回はdocker公式のDocker Hubを指定します。

ptc0.PNG

Dockerが提供しているレジストリなど、シークレットの設定などが欲しいものを指定した場合は追加の設定ページが表示されます。

ptc1.PNG

次はリポジトリプレフィックスの指定です。任意の名前で構いませんが、今回はデフォルト設定でいきます。

ptc2.PNG

最後にレビューで設定を確認し、問題なければ作成します。

ptc3.PNG

これにてプルスルーキャッシュの設定は完了です。

ECS タスク定義の作成

ECSのコンソールページにアクセスし、「タスク定義」から「新しいタスク定義の作成」を選択肢、タスク定義を作成します。

タスク1.PNG

インフラストラクチャの要件

設定は任意の値を入力してください。
今回はFargateを使用するので、起動タイプをFargateにしています。

タスク2.PNG

コンテナ

コンテナの詳細を指定する際、「イメージURI」を先ほど作成したプルスルーキャッシュを利用した形に書き換える必要があります。

タスク3.PNG

まず、ECRのパブリックギャラリーにアクセスし、利用したいコンテナイメージのページを開きます。
※パブリックギャラリーはECRのコンソールページからもアクセス可能です

今回はhttpdの最新バージョンで作成してみます。
任意のバージョンを選んだら「Copy」を押してURIをコピーします。

httpdギャラリー.PNG

コピーしたパスは以下のようになっています

public.ecr.aws/docker/library/httpd:latest

このパスのpublic.ecr.aws/dockerの部分を以下のように置き換えます

<アカウントID>.dkr.ecr.<region>.amazonaws.com/<プルスルーキャッシュのリポジトリプレフィックス>

具体的には以下のようなパスになります

111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/docker-hub/library/httpd:latest

プルスルーキャッシュのリポジトリプレフィックスは先ほど作成したものです。
上記のパスをタスク定義の「イメージURI」に貼り付けます

タスク5.PNG

他の設定値の設定は任意です。

ECSタスク実行ロールへのECR操作権限の付与

ECSタスク実行のためのサービスロールはタスク定義作成時に「新しく作成」を指定(デフォルト)すると自動でecsTaskExecutionRoleというサービスロールがECSタスク作成されます。
このロールにはAmazonECSTaskExecutionRolePolicyというマネージドポリシーがアタッチされています。
このマネージドポリシーにはECRのプライベートレジストリを読み取る権限はついているのですが、プライベートレジストリを作成する権限がついていません。

プルスルーキャッシュはプライベートレジストリにパブリックレジストリのリポジトリのイメージがプライベートリポジトリにコピーされるため、以下のような許可が必要です

# ポリシー名
1 ecr:CreatePullThroughCacheRule
2 ecr:BatchImportUpstreamImage
3 ecr:CreateRepository

今回はECRのフルアクセス権限を与えておきます。
policy.PNG

ECSクラスターの作成

ECSのコンソールページから「クラスター」を選択し、「クラスターの作成」を行います。

cluster1.PNG

今回はFargateを利用するので「インフラストラクチャ」ではAWS Fargateを指定しています。

cluster2.PNG

なお、クラスター作成の際はCoudFormationによりスタックが作成され、そのスタックによってクラスターが作成されるという処理が行われるので、操作しているユーザの権限にCloudFormationの操作権限が必要となります。

クラスターのサービス作成

作成されたクラスターを開き、「サービス」タブから「作成」をクリックします

service1.PNG

今回は以下のような設定でサービスを作成しました。

環境

service2.PNG

デプロイ設定

service3.PNG

ネットワーキング設定

service4.PNG

なお、この時指定するセキュリティグループでは以下を満たすインバウンドルールが必要です。

設定項目 設定値
Type   HTTP
Protocol   TCP
ポート範囲    80
ソース   0.0.0.0/0

サービスの作成を確認

サービスの作成が無事完了しました。

deploy-done.PNG

おわりに

上記手順でパブリックレジストリのリポジトリのイメージをプライベートサブネットから利用することができました。

個人的な一番のつまりポイントはタスク実行ロールにECRの権限を与える必要がある部分でしょうか。

以上、ご参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?