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ロールの作成をおこないます。
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 ID | vpc-[先ほど作成したVPCの番号](Test-vpc) |
関連付けられたVPC CIDR | 10.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に名前を設定していれば名前が表示されています。
項目 | 設定値 |
---|---|
VPC | Test-vpc(先ほど作成したVPC) |
アタッチできていれば、IGWの詳細画面にてVPC IDが設定されています。
ルートテーブルの作成
パブリックサブネット用のルートテーブルの作成
デフォルトの設定では、VPCに設定されたIPv4 CIDR内への通信しかできない状態になっています。
作成したパブリック用のサブネットにIGWへのルートを設定します。
ルートテーブルの作成
VPCには先ほど作成したものを選択します。
項目 | 設定値 |
---|---|
名前タグ | Test-routetable-public |
VPC | Test-vpc(先ほど作成したVPC) |
設定したら作成します。
作成したルートテーブルのルートタブにてルートの編集を選択し、ルートを調整します。
ルートの追加を選択します。
ターゲットの選択では、まずInternet Gatewayを選択してから先ほど作成したIGWを選択します。
項目 | 設定値 |
---|---|
送信先 | 0.0.0.0/24 |
ターゲット | (先ほど作成したIGW) |
ルートの保存を選択して、IGWが設定できていればOKです
次は、この作成したルートテーブルをパブリックのサブネットに割り当てます。
サブネットの画面に移動し、作成したパブリック用のサブネットを選択します。
ルートテーブルタブのルートテーブルの関連付けを編集を選択します。
ルートテーブルには、先ほど作成したIGWを設定しているものを選択します。
項目 | 設定値 |
---|---|
ルートテーブルID | Test-vpc(先ほど作成したルートテーブル) |
保存を選択します。
続いて、もう1つのパブリック用のサブネットも同じ設定をします。
設定が完了後、パブリック用のサブネットにパブリック用のルートテーブルが設定されていることを確認します。
一覧にて、publicのサブネットに同じルートテーブルが付いていればOK
エンドポイントの作成
プライベートのサブネットでECSのタスクを起動させますが、NAT Gatewayを設定せずにエンドポイントでタスクが起動できるようにします。
必要なのは3つのエンドポイントです
- ecr.dkr
- ecr.api
- s3
- logs
エンドポイントの画面に移動し、エンドポイント作成を選択
検索フィールドにecr.dkrを入力して検索し、設定をしていきます。
VPCやサブネット、セキュリティグループは作成済みのものです。
項目 | 設定値 |
---|---|
サービスカテゴリ | AWSサービス |
サービス名 | com.amazonaws.ap-northeast-1.ecr.dkr |
VPC | Test-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 |
VPC | Test-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) |
VPC | Test-vpc(先ほど作成したVPC) |
ルートテーブルの設定 | (プライベート用のサブネットのルート) |
プライベートDNS名を有効にする | このエンドポイントで有効にする |
セキュリティグループ | (デフォルトのセキュリティグループのまま) |
ポリシー | フルアクセス |
最後に、logsにエンドポイントも作成します。
画面は同じなので、設定値のみ記載します。
項目 | 設定値 |
---|---|
サービスカテゴリ | AWSサービス |
サービス名 | com.amazonaws.ap-northeast-1.logs |
VPC | Test-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 |
VPC | Test-vpc(先ほど作成したVPC) |
エンドポイントの画面に移動し、s3のエンドポイントのルートテーブルのルートテーブルの管理を選択。
先ほど作成した、プライベートサブネット用のルートテーブルを選択します。
項目 | 設定値 |
---|---|
チェック | (さきほど作成したプライベートサブネット用のルートテーブル) |
ルートテーブルの変更を選択します。
次に、作成したルートテーブルをプライベート用のサブネットに割り当てます。
プライベート用のサブネットを選択して、ルートテーブルタブからルートテーブルの関連付けを編集を選択。
先ほど作成した、プライベートサブネット用のルートテーブルを選択します。
項目 | 設定値 |
---|---|
ルートテーブルID | Test-routetable-private(先ほど作成したプライベートサブネット用のルートテーブル) |
ルートにS3のエンドポイントが入っていればOKです。
保存を選択
もう1つのプライベートのサブネットも同様に設定します。
設定が完了したら、以下のようにパブリックのサブネットにはパブリックのルートテーブルが、プライベートのサブネットにはプライベートのルートテーブルが設定できています。
セキュリティグループの更新
ECS用にセキュリティグループの作成を行います。
セキュリティグループはインスタンス単位で設定するものですが、今回は簡単にするためにすべての通信を許可します。
セキュリティグループの画面に移動し、作成したVPCのデフォルトのセキュリティグループを選択。
インバウンドルールタブに移動し、インバウンドルールを編集を選択。
以下のように、ソースをsg-XXXXから0.0.0.0/0に変更します。
設定できたらルールを保存を選択。
作成できていたら、以下のようにソースが0.0.0.0/0になっています。
まとめ
今回は、ECSのためのネットワークを構築しました。
セキュリティグループの設定などは厳密に行っていないため、セキュリティに関しては甘い箇所が残っています。
この記事では、画面を見ることが目標のため省略しています。
次のPartでは、ECSで動かすためのコンテナイメージを作成していきます。
参考
エンドポイントを使用してプライベートサブネットでECSを使用する
DockerイメージをECRからプライベートな接続で取得するにはPrivate Linkを使うべし