概要
- AWS Fargate で起動したコンテナからあるサーバへの接続をIPアドレスで制限をかけたいが、普通にFargateを設定したコンテナでは、割り当てられるグローバルIPアドレスはコロコロ変わり固定ではない。
- AWS Fargate で VPC 内に作成されたコンテナからインターネットへ出るときに AWS NATゲートウェイを経由させることで、NATゲートウェイに割り当てたEIPがコンテナの接続元IPアドレスとして固定することができる。接続先のサーバではそのEIPを設定することでアクセス制限を行うことができるようになる。
構成概要
構成内容
- Amazon ECR
- Dockerイメージレジストリ
- ECR リポジトリの作成は、AWS CLI で行う
- Amazon Fargate
- コンテナ実行環境
- ECR からイメージを pull する
- VPC
- Internetゲートウェイをアタッチする
- Subnet-A と SubnetB を作成する
- Subnet-A
- コンテナ用サブネット
- ルートテーブルで、インターネットへの接続(0.0.0.0/0)を NATゲートウェイに向ける
- Subnet-B
- NATゲートウェイ用サブネット
- ルートテーブルで、インターネットへの接続(0.0.0.0/0)を Internetゲートウェイに向ける
- コンテナ
- AWS ECR にある Docker イメージを AWS Fargate が PULL して、Subnet-A にコンテナ化する
- NAT ゲートウェイ
- Elastic IP を割り当てる
VPC環境設定概要
-
VPC作成
Internetゲートウェイをアタッチする -
NATゲートウェイ用サブネット (Subnet-B) 作成
ルートテーブル設定
・インターネットへの接続(0.0.0.0/0)を Internetゲートウェイに向ける -
Subnet-B 内に NATゲートウェイを作成
Elastic IP を割り当てる(今回は 3.113.58.14 ) -
コンテナ用サブネット (Subnet-A) 作成
ルートテーブル設定
・インターネットへの接続(0.0.0.0/0)を NATゲートウェイに向ける
動作確認用コンテナのDockerイメージを作成
接続元IPアドレスを確認するために、コンテナ内から https://ifconfig.me にアクセスして接続元(コンテナ)のIPアドレスを確認する
- Dockerfile 作成
FROM alpine:latest
RUN apk --no-cache add curl
CMD curl -s https://ifconfig.me
- ビルド
$ docker build -t demo .
- イメージ確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo latest 204b606e4331 33 minutes ago 6.92MB
alpine latest 4d90542f0623 2 days ago 5.58MB
- 実行テスト
$ docker run demo
xxx.xxx.xxx.xxx (接続元IPアドレス)
AWS ECR 設定概要
参考:Dockerイメージを AWS ECR に登録して AWS ECS の Fargate でコンテナ化してサービス提供
-
AWS CLI で AWS ECR を設定するための IAM ユーザを作成
AmazonEC2ContainerRegistryFullAccessポリシーをアタッチする -
1.のIAMユーザをターミナルに登録する (今回は "ecr" というプロファイル名)
$ aws configure --profile ecr
AWS Access Key ID [None]: **********
AWS Secret Access Key [None]: **********
Default region name [None]: ap-northeast-1
Default output format [None]:
- ECR のリポジトリを作成する (今回は "demo-repository" というリポジトリ名)
$ aws ecr create-repository --repository-name demo-repository --profile ecr
- AWS ECR レジストリ用の docker login 認証コマンド文字列(12時間有効な認証トークン)を取得する
$ aws ecr get-login --no-include-email --profile ecr
docker login -u AWS -p eyJwYXlsb2FkI〜
5. 上記で発行されたコマンドをそのまますべてをコピーして、ターミナルにペーストして実行する
$ docker login -u AWS -p eyJwYXlsb2FkI〜
〜
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
Dockerイメージを AWS ECR へ PUSH する
Docker イメージにタグを付ける
$ docker tag demo <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository:demo
確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository demo 204b606e4331 38 minutes ago 6.92MB
demo latest 204b606e4331 38 minutes ago 6.92MB
alpine latest 4d90542f0623 2 days ago 5.58MB
Dockerイメージを AWS ECR に PUSH する
$ docker push <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository:demo
The push refers to repository [777813037810.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository]
39f660b1173d: Pushed
256a7af3acb1: Pushed
demo: digest: sha256:e903f0093f0d376a607c95279a204b36a15335dbda9fd0d73722f7593494aeff size: 738
AWS Fargate の設定とタスク実行
参考:Dockerイメージを AWS ECR に登録して AWS ECS の Fargate でコンテナ化してサービス提供
1. タスク定義を作成する
(1) 新しいタスク定義の作成
(2) 起動タイプで FARGATE を選択
(3) タスクとコンテナの定義の設定
①タスク定義名を ここでは demo-demo とする
他はデフォルト
②タスクの実行IAMロールはデフォルト
③タスクサイズは最小サイズで
④コンテナの定義
コンテナの追加
コンテナ名: demo-container
イメージ: <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository:demo
他はデフォルト
⑤作成
2. クラスターを作成する
(1) クラスターの作成
(2) クラスターテンプレートの選択
「AWS Fargate を使用」 を選択
(3) クラスターの設定
クラスター名: demo-cluster
他はデフォルト
(4) 作成
3. タスク実行を作成する
① 新しいタスクの実行
② タスクの実行
起動タイプ: FARGATE
タスク定義: demo-task:1
クラスター: demo-cluster
クラスターVPC
サブネット:コンテナ用に作成したサブネット
パブリックIPの自動割り当て: DISABLED
③ タスクの実行
タスクを実行すると、コンテナのプロビジョニングが始まり、実行後に消滅する
4. タスクの実行結果の確認
タスクの実行結果は、CloudWatch ログ に送られる。
CloudWatchロググループは、タスク定義を作成した時に作られている。
CloudWatchロググループ: /ecs/demo-task
メッセージに Elastic IP の IPアドレスが表示されていれば成功。