AWS
AdventCalendar
docker
ECS
ECR

ECSで上げたコンテナは本当にVPC上インスタンスのサブネットやセキュリティグループ適用されるのか?

More than 1 year has passed since last update.

dots girls Advent Calendar 2016、今年もトップバッターを頂きました吉澤です!

今年の夏くらいに東京リージョンでもECRが使えるようになり、わざわざECRのみ別リージョンにするなど考える必要がなくなり、だいぶ現実的なサービスとなりました。
ECSのトップページに、このようなことが書いてるので、本当にコンテナから接続できるかどうか実験してみることにしました。

セキュリティグループ、Elastic Load Balancing、EBSボリューム、IAM ロールなどへのアクセスを実行できます。

今回はECSにて立てたコンテナに対して、セキュリティ的な検証をすべく、以下のような構成を考えて作ってVPCインスタンスからプライベートのサブネットグループへアクセス出来るかを検証します。

構成図

AWSコンソールで準備

VPCを作成

適当にwakana_testと名付けてVPCを作成します。

VPC作成

VPC作成完了

サブネットを作成

webとredisの二つのサブネットを作成します。

web用のサブネットグループを作成

redis用のサブネットグループを作成

サブネット作成完了

インターネットゲートウェイを作成

インターネットゲートウェイを作成し、先ほど作成したVPCにアタッチします。

インターネットゲートウェイ作成

インターネットゲートウェイをVPCにアタッチ

インターネットゲートウェイ設定完了

パブリックとプライベートのルートテーブルを作成

サブネット作成時にひとつ出来ているので、そちらはプライベートと名付け、パブリックを新しく作ります。
作成後はパブリックのみルートタブでインターネットゲートウェイに仕向けます。

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

パブリック用ルートテーブルにインターネットゲートウェイを設定

webのサブネットグループにパブリックルートテーブルを割り当て

サブネットグループのデフォルトがプライベートルートテーブルなので、webのサブネットグループにパブリックルートテーブルを割り当てます。

webのサブネットグループにパブリックルートテーブルを割り当て

セキュリティグループを作成

webとredis用の二つ用を作成します。
今回は踏み台サーバーなど用意しないので、web用サーバーに直接ssh出来るように設定します。

web用セキュリティグループ作成

redis用セキュリティグループ作成

web用セキュリティグループインバウンド設定

redis用セキュリティグループインバウンド設定

ECRにリポジトリを作成

今回は適当にwakana_testを作成します。

ECRにリポジトリを作成

Dockerまわりの準備

今回はすぐに動かせるNodeJSを用意します。

package.jsonを作成

$ npm init

無心でEnterキーを連打します。

index.jsを作成

お約束のHello World!を返します。

index.js
var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});
app.listen(3000);                     

Dockerfileを作成

FROM node

WORKDIR /usr/src/app
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install express
COPY . /usr/src/app
EXPOSE 3000
CMD node /usr/src/app/index.js

Dockerイメージをサーバーにpush

ECRにログイン

$ $(aws ecr get-login --region ap-northeast-1)

私の環境ではAWS CLIが古くて動かなかったためAWS CLIのアップデートしました。

Dockerfileよりイメージを作成

$ docker build -t wakana_test .

イメージをpushできるようにタグ付け

$ docker tag wakana_test:latest 308321613648.dkr.ecr.ap-northeast-1.amazonaws.com/wakana_test:latest

ECRにイメージをpush

$ docker push 308321613648.dkr.ecr.ap-northeast-1.amazonaws.com/wakana_test:latest

上がりました。

ECRにイメージのプッシュ完了

ECSのクラスターを設定

適当にwakana-testを作成します。
ネットワーキングのところで、最初に作ったweb用のサブネットとセキュリティグループを割り当てます。

ECSのクラスター設定1

ECSのクラスター設定2

ECSのクラスター設定3

タスクの作成

イメージからコンテナをビルドするタスクを定義します。
いろいろ細かく設定できるのですが今回はデフォルト値にします。

ECSのタスク設定1

ECSのタスク設定2

クラスターのサービスからタスクを割り当て

先程作ったタスクを割り当てます。

ECSクラスターにタスクを割り当て

コンテナにブラウザからアクセス出来るか確認

ACTIVEステータスになったらEC2のマネジメントコンソールからIP確認しブラウザからアクセスします。

EC2のマネジメントコンソールからIP確認

Hello World!

Hello World!と表示されました。

ElastiCacheにてRedisサーバ作成

ElastiCacheにてRedisサーバーを作成します。
今回はレプリケーション無し最小構成で作成します。

ElastiCacheのサブネットグループに、VPCグループ内のサブネットを割り当て

ElastiCache内のサブネットグループから、VPCのサブネットグループを割り当てます。

ElastiCacheをVPC内に設定

Redisサーバー作成

作成時に先ほどつくったサブネットグループを割り当てます。

Redisサーバー作成1

Redisサーバー作成2

ローカル、コンテナ、インスタンスそれぞれからRedis疎通確認

ローカル

Macなのでbrewでインストールします。

$ brew install redis

redis-cliでアクセスします。

Macからredisにアクセス

拒否られました。

コンテナ

インスタンスから$ docker exec -it container_name bashで入ります

$ apt-get update -y
$ apt-get install -y redis-server

redis-cliでアクセスします。

Dockerコンテナからredisにアクセス

コンテナから入れました!
適当にデータいれてみました。

Redisテストコマンド

EC2インスタンス

yumでインストール出来ません。

$ sudo yum -y install gcc wget
$ sudo wget http://download.redis.io/redis-stable.tar.gz
$ sudo tar xvzf redis-stable.tar.gz
$ cd redis-stable
$ sudo make

これでやっと起動できます。
redis-cliでアクセスします。

EC2インスタンスからredisにアクセス

繋がりました。
先ほどのハッシュ型データを取得します。

Redisテストコマンド

aaaが返ってきました。

結果

VPC内に立てたコンテナ上から非公開のサブネットゾーンに接続できました。
これで本番でもセキュアに運用できることが分かりました。

dots.女子部について

インフラ、サーバー、フロント開発から運用ノウハウ、女性エンジニアのキャリアについてなどいろいろな観点から勉強したり、情報共有している女性エンジニアのための部活です。
興味がある方は是非SNSアカウントのフォローしてみて下さい!

Twitter
Facebook

明日はiOSの女神、まきちゃんよろしくお願いいたします\(^o^)/