FlaskアプリをAWS ACMでSSL化しながらFargateで公開する全ステップ (前編)
Flaskで開発したWebアプリをFargateに乗せ、かつAWS ACMでSSL対応する記事に巡り会えなかったので、趣味で開発したアプリを公開する傍らで記事にしてみました。
アーキテクチャ
よくあるWEBアプリのベストプラクティスのようなアーキテクチャです。
実装手順
Step | 項目 | 対象サービス |
---|---|---|
1 | ドメイン発行 | Route 53 |
2 | 証明書発行 | ACM、Route53 |
3 | VPC作成 | VPC |
4 | セキュリティグループ作成 | セキュリティグループ |
5 | VPCエンドポイント作成 | VPCエンドポイント |
6 | ALB作成 | ALB |
7 | コンテナイメージ作成 | ローカルマシンなど |
8 | レポジトリ作成とイメージアップロード | ECR |
9 | コンテナ作成 | ECS/Fargate |
10 | ALBのリスナー修正 | ALB |
11 | CNAMEレコード登録 | Route 53 |
12 | テスト | テスト |
1. ドメイン発行
既にドメインをお持ちの方はこのステップはスキップしてください。 ドメインをお持ちでない方は、公開するWEBアプリに用いるドメインを発行する必要があります。ドメインにもよりますが10ドル程かかりますので、検証目的の方はご注意を。 手順は簡単で、Route 53>登録済みのドメイン>ドメインの登録へ遷移します。 お好きなドメインを購入します。購入後の注意点として、ドメイン管理者のメールアドレスに対してメールが飛んできますので、忘れず検証URLをクリックします。
ドメインが利用できるまで数日かかる場合があります。なのではじめのステップに持ってきています。
2. 証明書発行
続いて証明書発行まで行ってしまいましょう。ACM<リクエストと遷移。 パブリック証明書を選択し、任意のドメイン(www.abc.comなど)を入力します。証明書の検証はDNSを選択します。そのまま進み証明書を発行します。発行した証明書はそのままではまだ未検証で利用することができません。そこで証明書画面からダウンロードできるDNS検証用のCNAMEのパラメータを取得します。 Route 53に戻り、ホストゾーン<対象のドメインと遷移します。先程取得したDNS検証用のパラメータを使ってCNAMEレコードを作成します。それぞれのパラメータは先頭が半角アンダースコア(_)がついているので注意してください。 検証が完了するまで少し時間がかかるので、次のステップに進んで後で確認してみてください。
3. VPC作成
お次は仮想ネットワークを作っていきます。お手軽にVPC環境が作れるウィザードに任せてサクッと作ります。以前と比べてとても簡単になりましたね。
4. セキュリティグループ作成
以下に記載する順序通りにセキュリティグループ(以下SG)を作っていきます。SGはポート番号やIPアドレス、またはIPアドレスの代わりに別のSGを指定してルールを作成できます。SGを指定してルールを作成すれば、細かくIPアドレスをルールに記載する必要がなくなり運用が楽になります。以下表にまとめている3件のSGを作成します。インバウンドルールのみ設定し、アウトバウンドは全てデフォルトのまま全許可で使用します(なのでアウトバウンドは特に記載していません)。
ALB用SG
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTP | TCP | 80 | 0.0.0.0/0 |
HTTPS | TCP | 443 | 0.0.0.0/0 |
ECS用SG
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
すべてのトラフィック | すべて | すべて | ALB用SG |
VPCエンドポイント用SG
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
すべてのトラフィック | すべて | すべて | ECS用SG |
5. VPCエンドポイント作成
ECS/Fargateのコンテナはプライベートサブネットに配置するため、コンテナイメージの取得やCloudWatch Logsへのログ出力はエンドポイント経由で行うか、NATゲートウェイなどを用いてインターネット経由で接続できる必要があります。今回はセキュリティの求められる環境を想定し、VPCエンドポイントを用います。
VPC > エンドポイント > エンドポイントを作成に遷移し、任意の名前をつけ「ecr」で検索し、「com.amazonaws.ap-northeast-1.ecr.api」を見つけてチェックします。 VPCを選択したらサブネットを選ぶ画面が出てくるのですが、プライベートサブネットが選択されていることを確認してください。
SGは先ほど作成したエンドポイント用SGを選択し、ポリシーは一旦フルアクセスのままとし、「エンドポイント作成」をクリックします。少し時間が経てばエンドポイントが利用できるようになります。 この通り一つ一つエンドポイントを必要な分だけ作成します。今回は4つのエンドポイントを作成します。S3のみゲートウェイタイプ、それ以外はインターフェースタイプで作成します。
6. ALB作成
続いてALBを作成します。EC2<ロードバランサー<Application Load Balancerから作成します。用語が少しわかりにくいのですが、いつの間にかこんなページが追加されていました。 任意の名前を入力、VPCを選択してパブリックサブネットを2つ以上選択します。 SGは先程作成したものを選択します。次にリスナーを設定するのですが、事前にターゲットグループを作成する必要がありますので、「ターゲットグループの作成」をクリックします。ただしこの時点でまだFargateのコンテナを作成していないので、取り急ぎALBの作成が完了できるようダミーのターゲットグループを作成します。パラメータは何でもいいのでターゲットグループを作成します。 ALB側でダミーのターゲットグループを作成したら、ALB作成を完了します。 作成が完了したALBを確認し、いま設定したリスナーを削除します。またターゲットグループに遷移し、ダミーのターゲットグループも削除します。
かなり長くなってしまったので、一旦ここで切ります。よろしければ後半もご確認ください。