LoginSignup
52
31

More than 3 years have passed since last update.

AWS Fargate で実行したコンテナに固定のグローバルIPアドレスを割り当てる

Last updated at Posted at 2019-06-22

概要

  • AWS Fargate で起動したコンテナからあるサーバへの接続をIPアドレスで制限をかけたいが、普通にFargateを設定したコンテナでは、割り当てられるグローバルIPアドレスはコロコロ変わり固定ではない。
  • AWS Fargate で VPC 内に作成されたコンテナからインターネットへ出るときに AWS NATゲートウェイを経由させることで、NATゲートウェイに割り当てたEIPがコンテナの接続元IPアドレスとして固定することができる。接続先のサーバではそのEIPを設定することでアクセス制限を行うことができるようになる。

構成概要

スクリーンショット 2019-06-22 18.24.18.png

構成内容

  • 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環境設定概要

  1. VPC作成
    Internetゲートウェイをアタッチする

  2. NATゲートウェイ用サブネット (Subnet-B) 作成
    ルートテーブル設定
    ・インターネットへの接続(0.0.0.0/0)を Internetゲートウェイに向ける

  3. Subnet-B 内に NATゲートウェイを作成
    Elastic IP を割り当てる(今回は 3.113.58.14 )

  4. コンテナ用サブネット (Subnet-A) 作成
    ルートテーブル設定
    ・インターネットへの接続(0.0.0.0/0)を NATゲートウェイに向ける

動作確認用コンテナのDockerイメージを作成

接続元IPアドレスを確認するために、コンテナ内から https://ifconfig.me にアクセスして接続元(コンテナ)のIPアドレスを確認する

  1. Dockerfile 作成

FROM alpine:latest
RUN apk --no-cache add curl
CMD curl -s https://ifconfig.me
  1. ビルド

$ docker build -t demo .
  1. イメージ確認

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
demo                latest              204b606e4331        33 minutes ago      6.92MB
alpine              latest              4d90542f0623        2 days ago          5.58MB
  1. 実行テスト

$ docker run demo
xxx.xxx.xxx.xxx (接続元IPアドレス)

AWS ECR 設定概要

参考:Dockerイメージを AWS ECR に登録して AWS ECS の Fargate でコンテナ化してサービス提供

  1. AWS CLI で AWS ECR を設定するための IAM ユーザを作成
    AmazonEC2ContainerRegistryFullAccessポリシーをアタッチする

  2. 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]:
  1. ECR のリポジトリを作成する (今回は "demo-repository" というリポジトリ名)

$ aws ecr create-repository --repository-name demo-repository --profile ecr
  1. 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) 新しいタスク定義の作成
01.png

(2) 起動タイプで FARGATE を選択

02.png

(3) タスクとコンテナの定義の設定

①タスク定義名を ここでは demo-demo とする
 他はデフォルト

06.png

②タスクの実行IAMロールはデフォルト

04.png

③タスクサイズは最小サイズで

05.png

④コンテナの定義

コンテナの追加

07.png

コンテナ名: demo-container
イメージ: <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/demo-repository:demo
他はデフォルト

08.png

⑤作成

09.png

2. クラスターを作成する

(1) クラスターの作成

10.png

(2) クラスターテンプレートの選択

「AWS Fargate を使用」 を選択

11.png

(3) クラスターの設定

クラスター名: demo-cluster
他はデフォルト

12.png

(4) 作成

13.png

3. タスク実行を作成する

① 新しいタスクの実行

14.png

② タスクの実行

起動タイプ: FARGATE
タスク定義: demo-task:1
クラスター: demo-cluster
クラスターVPC
サブネット:コンテナ用に作成したサブネット
パブリックIPの自動割り当て: DISABLED

15.png

③ タスクの実行
タスクを実行すると、コンテナのプロビジョニングが始まり、実行後に消滅する

16.png

4. タスクの実行結果の確認

タスクの実行結果は、CloudWatch ログ に送られる。
CloudWatchロググループは、タスク定義を作成した時に作られている。

CloudWatchロググループ: /ecs/demo-task
メッセージに Elastic IP の IPアドレスが表示されていれば成功。

17.png
52
31
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
52
31