AWS

Amazon ECSにDjangoとNginxをデプロイしてアクセスする方法 Part1 -ネットワーク作成編-

Amazon EC2などの有名なサービスは書籍も出ておりとても使いやすいです。
しかし、Amazon ECSについては書籍がほとんど出ていません。
出ていたとしてもCLIを利用したものになり、そもそもAWSがあまりわからない人にとってはハードルが非常に高いです。

この記事では、Amazon ECS FargateでDjangoとNginxのコンテナを動かし、Djangoの管理画面を見るまでの設定方法を紹介します。
基本的にはGUIであるマネジメントコンソール画面を使用し、初心者にもわかりやすく解説します。

長くなってしまったので、3部構成にしております。
この記事はPart1です。Part2へPart3へ

対象読者
  • AWSにコンテナのDjangoをデプロイして動かしたい人!
  • AWSは少しわかる
  • Dockerは基本がわかっている




この記事でやること
  • Amazon ECSを利用するのに必要なVPC・サブネット・IGW・NatGateway・Route・IAMロール・セキュリティグループの作成
  • Djangoを利用するのに必要なECSのタスク定義・サービス定義・RDS・NLBの作成
  • Amazon ECSで利用するためのDjangoとNginxの設定、コンテナの構成

前提条件

1からすべてをここに書きたいのですが、そこまでの労力をかけることができません。

そのため、以下については問題がないことを前提にさせて頂きます。

  • AWSを好きに扱える環境である(会社などのアカウントではなく、個人のアカウント)
  • 管理者ユーザーを作成しており、管理者ユーザーでコンソールを操作できること
  • インフラの基本知識を知っていること

このマーカーは、その文字列のボタンを押すことを意味します。

全体構成

最終的な全体構成図です。

★図を入れる★

IAMロールの作成

ECSのタスクとサービス用にIAMロールの作成をおこないます。

IAMロール

Identity and Access Managementの略で、AWSのサービスリソースに対して操作権限を与える仕組み

例えば、EC2インスタンスはS3にアクセスができないため、S3へのアクセス権限を持ったIAMロールをEC2インスタンスに割り当てる必要がある

まずは、マネジメントコンソールにてIAMサービスに移動します。
[アクセス管理]->[ロール]に移動し、ロールの作成を押して作成していきます。

ECSタスク実行用のIAMロール

ECSのタスク実行用ロールには、ECS上でコンテナを実行するのに必要な権限を持たせます。
ログを出力させるCloudWatch Log、コンテナイメージが格納されているECRは必須です。

では、ECSタスク用に以下を設定していきます。

項目設定値
エンティティAWSサービス
ユースケースの選択
-サービス選択
Elastic Container Service
ユースケースの選択Elastic Container Service Task

次のステップへ

ポリシーのフィルタの横の検索窓に「ECSTask」と入力し、AmazonECSTaskExecutionRolePolicyを選択。

割り当てる権限の詳細は以下の通りです。

サービスアクセスレベルリソース
CloudWatch Logs書き込みすべてのリソース
Elastic Container Registry読み込みすべてのリソース

ECSはコンテナですので、ログファイルをローカルに出力しても再起動で消えてしまいます。
そのために、CloudWatch Logsにログを出力できるように書き込みの権限をECSのタスクに付与します。

ECS用のコンテナイメージはECR(Elastic Container Registry)に格納されています。
ECRサービスからコンテナイメージをとってこれるように読み込み権限を付与します。

アクセス権限の境界は設定せずに、次のステップへ

タグはお好みで次のステップへ

確認では、ロール名と説明を設定します。
タスク名はお好みで。
今回は「TaskExecution-ECSTaskRole」とします

最後にロールの作成ボタンを押し、ECSタスク用のロールが完成です。

問題なく作成できていれば、以下のようにロール画面で表示されています。

ECSタスク用のIAMロール

ECSのタスク用のロールで、コンテナ自体に必要なロールになります。
コンテナからS3にアクセスするのであれば、S3への書き込みを許可する必要があります。

ECSサービス用のロールを作成していきます。
画面はECSタスク用ロール作成時と同じなので、設定値のみ記載します。

項目設定値
エンティティAWSサービス
ユースケースの選択
-サービス選択
Elastic Container Service
ユースケースの選択Elastic Container Service

次のステップへ

初めからAmazonEC2ContainerServiceRoleが設定されています。

次のステップへ

タグはお好みで次のステップへ

確認では、ロール名と説明を設定します。
タスク名はお好みですが、今回は「Test-ECSTaskRole」とします

最後にロールの作成ボタンを押し、ECSタスク用のロールが完成です。

問題なく作成できていれば、以下のようにロール画面で表示されています。

ネットワークの作成

仮想ネットワークとして、VPCを作成してセキュリティグループの作成などを行っていきます。

作成するネットワークの概要です。

VPCの作成

VPCサービスの画面に移動し、VPCの作成

以下のように設定します。

項目設定値
名前タグTest-VPC
IPv4 CIDRブロック10.0.0.0/16
IPv6 CIDRブロックIPv6 CIDRブロックなし
テナンシーデフォルト

名前とタグはお好みです。
IPv4 CIDRはお好みなのですが、サブネットマスクは16が良いらしいです。
IPv6は使わないのでなし。

VPCを作成でVPCを作成します。

作成されたら表示されます。

DNSホスト名を有効にしたいので、作成したVPCを選択した状態でアクションを開き、DNSホスト名を編集を押す。

DNSホスト名を有効にして変更を保存

VPCの詳細タブにて、DNSホスト名が有効になっていればOKです。

サブネットの作成

サブネットとして、2つのアベイラリティゾーンにそれぞれパブリックとプライベート用の2つのサブネットを作成します。

サブネットの画面に移動し、サブネットの作成

サブネットの作成画面にて、先ほど作成したVPCを選択する必要があります。
VPC作成時に名前を設定しておけばVPCの番号の後ろに名前(この記事ではTest-vpc)が付くのでわかりやすいです。

項目設定値
VPC IDvpc-[先ほど作成したVPCの番号](Test-vpc)
関連付けられたVPC CIDR10.0.0.0/16 ←自動で設定される

サブネットは4つ作成するので、1つの画面だけを載せておきます。
設定したら、新しいサブネットを追加を押して4つ分作成してください。

サブネット1つ目

項目設定値
サブネット名Test-subnet-az1a-public
アベイラリティゾーンアジアパシフィック(東京)/ap-northeast-1a
IPv4 CIDRブロック10.0.0.0/24
タグ(自動設定のまま)

サブネット2つ目

項目設定値
サブネット名Test-subnet-az1a-private
アベイラリティゾーンアジアパシフィック(東京)/ap-northeast-1a
IPv4 CIDRブロック10.0.1.0/24
タグ(自動設定のまま)

サブネット3つ目

項目設定値
サブネット名Test-subnet-az1c-public
アベイラリティゾーンアジアパシフィック(東京)/ap-northeast-1c
IPv4 CIDRブロック10.0.2.0/24
タグ(自動設定のまま)

サブネット4つ目

項目設定値
サブネット名Test-subnet-az1c-private
アベイラリティゾーンアジアパシフィック(東京)/ap-northeast-1c
IPv4 CIDRブロック10.0.3.0/24
タグ(自動設定のまま)

サブネットを作成を押し、4つまとめて作成します。

作成できていれば、4つのサブネットが表示されています。

IGWの作成

作成したVPCにIGW(インターネットゲートウェイ)を割り当てます。
IGWがないと、作成VPCから外部のネットワークにアクセスすることができません!

インターネットゲートウェイの画面に移動し、インターネットゲートウェイの作成

ここでは名前タグの設定だけです。

項目設定値
名前タグTest-igw
タグ(自動設定のまま)

名前はお好みですが、ここでは「Test-igw」にします。
インターネットゲートウェイの作成

作成ができたらIGWの詳細画面になるので、アクションを開いてVPCにアタッチを押す。

VPCのアタッチ画面にて、先ほど作成したVPCを選択してインターネットゲートウェイのアタッチ
VPCに名前を設定していれば名前が表示されています。

項目設定値
VPCTest-vpc(先ほど作成したVPC)

アタッチできていれば、IGWの詳細画面にてVPC IDが設定されています。

ルートテーブルの作成

パブリックサブネット用のルートテーブルの作成

デフォルトの設定では、VPCに設定されたIPv4 CIDR内への通信しかできない状態になっています。

作成したパブリック用のサブネットにIGWへのルートを設定します。
ルートテーブルの作成

VPCには先ほど作成したものを選択します。

項目設定値
名前タグTest-routetable-public
VPCTest-vpc(先ほど作成したVPC)

設定したら作成します。

作成したルートテーブルのルートタブにてルートの編集を選択し、ルートを調整します。

ルートの追加を選択します。
ターゲットの選択では、まずInternet Gatewayを選択してから先ほど作成したIGWを選択します。

項目設定値
送信先0.0.0.0/24
ターゲット(先ほど作成したIGW)

ルートの保存を選択して、IGWが設定できていればOKです

次は、この作成したルートテーブルをパブリックのサブネットに割り当てます。

サブネットの画面に移動し、作成したパブリック用のサブネットを選択します。
ルートテーブルタブのルートテーブルの関連付けを編集を選択します。

ルートテーブルには、先ほど作成したIGWを設定しているものを選択します。

項目設定値
ルートテーブルIDTest-vpc(先ほど作成したルートテーブル)

保存を選択します。

続いて、もう1つのパブリック用のサブネットも同じ設定をします。

設定が完了後、パブリック用のサブネットにパブリック用のルートテーブルが設定されていることを確認します。
一覧にて、publicのサブネットに同じルートテーブルが付いていればOK

エンドポイントの作成

プライベートのサブネットでECSのタスクを起動させますが、NAT Gatewayを設定せずにエンドポイントでタスクが起動できるようにします。

必要なのは3つのエンドポイントです

エンドポイントの画面に移動し、エンドポイント作成を選択

検索フィールドにecr.dkrを入力して検索し、設定をしていきます。
VPCやサブネット、セキュリティグループは作成済みのものです。

項目設定値
サービスカテゴリAWSサービス
サービス名com.amazonaws.ap-northeast-1.ecr.dkr
VPCTest-vpc(先ほど作成したVPC)
ap-northeast-1a(apne1-az4)Test-subnet-az1a-private(先ほど作成したプライベート用のサブネット1つ目)
ap-northeast-1c(apne1-az1)Test-subnet-az1c-private(先ほど作成したプライベート用のサブネット2つ目)
プライベートDNS名を有効にするこのエンドポイントで有効にする
セキュリティグループ(デフォルトのセキュリティグループのまま)
ポリシーフルアクセス

設定したら、エンドポイントの作成でエンドポイントを作成します。

ecr.apiも同様に作成します。

項目設定値
サービスカテゴリAWSサービス
サービス名com.amazonaws.ap-northeast-1.ecr.api
VPCTest-vpc(先ほど作成したVPC)
ap-northeast-1a(apne1-az4)Test-subnet-az1a-private(先ほど作成したプライベート用のサブネット1つ目)
ap-northeast-1c(apne1-az1)Test-subnet-az1c-private(先ほど作成したプライベート用のサブネット2つ目)
プライベートDNS名を有効にするこのエンドポイントで有効にする
セキュリティグループ(デフォルトのセキュリティグループのまま)
ポリシーフルアクセス

次は、S3のエンドポイントも作成します。
画面は同じなので設定値のみ記載しますが、S3ばGatewayにしてください。
ルートテーブルは、プライベートのサブネットが割り当てられているものにしてください。

項目設定値
サービスカテゴリAWSサービス
サービス名com.amazonaws.ap-northeast-1.s3(タイプ:Gateway)
VPCTest-vpc(先ほど作成したVPC)
ルートテーブルの設定(プライベート用のサブネットのルート)
プライベートDNS名を有効にするこのエンドポイントで有効にする
セキュリティグループ(デフォルトのセキュリティグループのまま)
ポリシーフルアクセス

最後に、logsにエンドポイントも作成します。
画面は同じなので、設定値のみ記載します。

項目設定値
サービスカテゴリAWSサービス
サービス名com.amazonaws.ap-northeast-1.logs
VPCTest-vpc(先ほど作成したVPC)
ap-northeast-1a(apne1-az4)Test-subnet-az1a-private(先ほど作成したプライベート用のサブネット1つ目)
ap-northeast-1c(apne1-az1)Test-subnet-az1c-private(先ほど作成したプライベート用のサブネット2つ目)
プライベートDNS名を有効にするこのエンドポイントで有効にする
セキュリティグループ(デフォルトのセキュリティグループのまま)
ポリシーフルアクセス

作成が完了すると、3つのエンドポイントが作成されます。

よく確認してほしいのが、全てのエンドポイントがプライベート用のサブネットに割り当てられていること!

プライベートサブネット用のルートテーブルの作成

続いてプライベートのサブネット用のルートテーブルを作成します。
S3のエンドポイントは作成しただけでは通信できないため、ルートの設定が必要です。

ecr.dkrとlogsはインタフェースタイプのエンドポイントのため、各サブネットのプライベートIPアドレスを持ちます。

そのため、ルートテーブルの設定が不要です。

プライベートサブネット用のルートテーブルを作成します。

画面は先ほど載せたので、設定値のみ記載します。

項目設定値
名前タグTest-routetable-private
VPCTest-vpc(先ほど作成したVPC)

エンドポイントの画面に移動し、s3のエンドポイントのルートテーブルのルートテーブルの管理を選択。

先ほど作成した、プライベートサブネット用のルートテーブルを選択します。

項目設定値
チェック(さきほど作成したプライベートサブネット用のルートテーブル)

ルートテーブルの変更を選択します。

次に、作成したルートテーブルをプライベート用のサブネットに割り当てます。

プライベート用のサブネットを選択して、ルートテーブルタブからルートテーブルの関連付けを編集を選択。

先ほど作成した、プライベートサブネット用のルートテーブルを選択します。

項目設定値
ルートテーブルIDTest-routetable-private(先ほど作成したプライベートサブネット用のルートテーブル)

ルートにS3のエンドポイントが入っていればOKです。
保存を選択

もう1つのプライベートのサブネットも同様に設定します。

設定が完了したら、以下のようにパブリックのサブネットにはパブリックのルートテーブルが、プライベートのサブネットにはプライベートのルートテーブルが設定できています。

セキュリティグループの更新

ECS用にセキュリティグループの作成を行います。
セキュリティグループはインスタンス単位で設定するものですが、今回は簡単にするためにすべての通信を許可します。

セキュリティグループの画面に移動し、作成したVPCのデフォルトのセキュリティグループを選択。

インバウンドルールタブに移動し、インバウンドルールを編集を選択。

以下のように、ソースをsg-XXXXから0.0.0.0/0に変更します。

デフォルトでは、デフォルトのセキュリティグループからの通信を許可する設定となっています。
そのままだとECSにてECRからのイメージのpullに失敗するため、すべて許可しておきます。

設定できたらルールを保存を選択。
作成できていたら、以下のようにソースが0.0.0.0/0になっています。

まとめ

今回は、ECSのためのネットワークを構築しました。

セキュリティグループの設定などは厳密に行っていないため、セキュリティに関しては甘い箇所が残っています。
この記事では、画面を見ることが目標のため省略しています。

次のPartでは、ECSで動かすためのコンテナイメージを作成していきます。

Part2へ

参考

ECSでの必要なエンドポイント

エンドポイントを使用してプライベートサブネットでECSを使用する

DockerイメージをECRからプライベートな接続で取得するにはPrivate Linkを使うべし