LoginSignup
66
69

More than 5 years have passed since last update.

AWS上のネットワーク構築メモ

Last updated at Posted at 2016-01-03

AWSのネットワーク設定

について、最近VPC1つあたりSecurity Groupの設定が500まで上限が開放されたのでこうやったほうがいいかな、というのを書いとく。

かなり長くなってしまった。

VPCを作る

数多あるAWSサービスからVPCを選択してVPCを作る。これがないと始まらない。

Screen Shot 2016-01-01 at 19.07.08.png

Screen Shot 2016-01-01 at 19.13.35.png

PrivateDNSでホストを引けるようにしとく

PrivateDNSでホスト名を引けるようにするため、
VPCのEdit DNS HostnamesでEnableに設定する。

Screen Shot 2016-01-02 at 18.32.01.png

Screen Shot 2016-01-02 at 18.32.09.png

Managed NAT gateway用のsubnetを切る

Managed NAT gatewayが先日発表されたので、それを使いたい。
そのためにSubnetを切る。

vpc.png

Availability Zoneはap-northeast-1aを選ぶ。
CIDR blockは10.0.0.0/27としてわけとく。

EC2,ELB,RDS,ElastiCache作成

以下のインスタンスを作成・利用するという体で作っていく。

  • ELBを利用する
  • EC2インスタンスを利用する
  • RDSを利用する
  • Redisを利用する

RegionはTokyoを選ぶ。AZはAとCを使う。

各サービス向けのSubnetを作成

以下の様な感じ。

Subnet 役割 AZ
10.0.5.0/27 EC2(踏み台) A
10.0.10.0/27 ELB A
10.0.10.32/27 ELB C
10.0.11.0/24 EC2 A
10.0.12.0/24 EC2 C
10.0.15.0/27 RDS A
10.0.15.32/27 RDS C
10.0.16.0/27 ElastiCache A
10.0.16.32/27 ElastiCache C

図にすると...

sample.png

こんな感じ。基本的な感じ。
ELBについては/27の広さがないと作れない状態だったりする。それでも狭いけど...。

Subnetを作成

こつこつ作成する...絵を起こすのはアレなのでできた結果のスクショ。

subnet.png

作成したSubnetをRoute Tableと結びつけ、public/privateなネットワークを構築

Internet Gatewayを作る

Internet Gatewayを作成し、先ほど作成したVPCにattachする。

internet-gateway.png

Route Tableを作成する

public用

インターネッツと通信するためのもの。

Routesの設定

作成したInternetGatewayをDestination 0.0.0.0/0に対してくっつける。
これでインターネットから通信を抜け出せるようになる。

public-01.png

Subnet Associationsの設定

インターネッツとふれあうであろうSubnetを設定する。

public-02.png

private用

内部で通信すれば良いもの。RDSやEC2インスタンス、ElastiCacheなど。

Routesの設定

作成したNatInstanceをDestination 0.0.0.0/0に対してくっつける。
ELBやJump hostからの通信はこのNATを使って名前解決を行う。

subnet01.png

Subnet Associationsの設定

インターネッツと触れ合わないであろうSubnetを設定する。

subnet02.png

Managed NAT gatewayを立てる

NAT GatewaysからCreate NAT Gatewayボタンを押す。
Subnetはさっき作ったやつを選択。

Screen Shot 2016-01-01 at 20.55.49.png

EIPも作成してしまおう。Managed NAT Gatewayができた。
作成時に自動的に割り当てられた!楽だ。

1.png

ELBやらEC2など構築

していく。

Keypairの登録

を予めしておく。

NETROWK & SECURITY > Key Pairs
から作成しとく。

Screen Shot 2016-01-02 at 18.14.45.png

EC2インスタンスの作成

AZ AとCにそれぞれ1台ずつ作る。
利用するAMIはUbuntu 64bit。

Screen Shot 2016-01-02 at 11.18.17.png

お金が勿体無いので最近使えるようになったt2.nanoインスタンスで構築していく。

Screen Shot 2016-01-02 at 11.21.58.png

Screen_Shot_2016-01-02_at_11_47_43.png

インスタンス作成時にEC2インスタンスに対するIAM Roleを設定する

今勤めてる会社の若手からそうしたほうがいいっすよ、と教えられたのでしておく。
IAMは作るけど、特に何も設定しない。何かが起きた時にアクセスできる権限を絞れるようにする。

Screen Shot 2016-01-02 at 11.50.11.png

Screen Shot 2016-01-02 at 11.52.15.png

Screen Shot 2016-01-02 at 11.52.46.png

何も設定しない。

Screen_Shot_2016-01-02_at_11_53_17.png

...ここまで書いてわかったけどEC2インスタンスを作る前にIAM Role作らないと
Viewに値が反映されないんだった... orz

リロードして設定する。

Screen_Shot_2016-01-02_at_11_55_21.png

サービス用のSecurity Groupを作っておく

あとで全体で利用できるSecurity Groupを作成するが、いまんところ
サービス用のSecurity Groupを作っとく。

sg.png

そしてそのままEC2インスタンスを立ち上げる。
(Key PairをIAM Roleからアップロードしておくことを忘れずに...)

EC2インスタンス作成時に作成したSecurity Groupのルールを変更する

basic-service としておく。そしてbasic-service Security Groupが設定されていたら
inbound/outboundかかわらずすべてのパケットを通す、というようにしてしまう。

sg2.png

普遍的に利用できるSecurity Groupを作成する

EC2用

apt-get updateなど実行したい場合、outboundをゆるめてやらないといけない。
ということでbasic-publicというSecurity Groupを作成する

ELB用

インターネッツとぶつかり合いを行うELBインスタンス用のSecurity Groupを作成する
basic-elbという名前で作成する。

踏み台用のインスタンスを作成する

インターネッツにて、直接サービス提供用のインスタンスにアクセスするのは問題がある、
ということで踏み台用インスタンス(jump host)を設定する。

Security Groupを作成する

basic-ec2-jump-hosts というEC2 Security Groupを作成する。
ルールは以下とする。

  • inbound

SSHのportはインスタンス起動初回時にインスタンスにアクセスできないとまずいので22番を開けておく。

Type Protocol Portrange Source
Custom TCP Rule TCP 22 0.0.0.0/0
  • outbound

すべて許可。

Type Protocol Portrange Source
All traffic All All 0.0.0.0/0

VPNをVyOSを利用するなどして構築していればSourceのルールを変えるべきではあるが...、今回は踏み台サーバを利用して直接サービス用のインスタンスに入ってしまおう。

EC2インスタンスを作成する

先ほど書いたセクションに書かれている通りの内容にそって、インスタンスを作成する。
但し、先ほどとは若干条件が異なる

  • Security Groupに先ほど作ったbasic-ec2-jump-hostsを付ける
  • Security Group basic-serviceについて、basic-ec2-jump-hostsからのパケット疎通について、inboundは22(SSH用)として設定し、疎通可能にする

sg4.png

  • IAM Roleにて、ec2-jump-hostsを作成し、EC2インスタンスに適用する。

Screen Shot 2016-01-02 at 13.32.16.png

jump-hosts.png

EIPを付ける

EIPを付けないとインターネッツ外からアクセスできないので、EIPを払い出し、
作成したEC2インスタンスに結びつけておく。

associate.png

SSHでホストにログインできるか確認

家から踏み台サーバにアクセスしてみる。
Ubuntu 14.04 のAMIからインスタンスを作成したので、
ubuntuユーザでアクセス。

> ssh ubuntu@{割り当てたEIP} -l ubuntu

アクセスできることを確認。で、Jump hostからサービスを提供する予定のEC2インスタンスにアクセスしてみる

> ssh ip-10-0-11-233.ap-northeast-1.compute.internal

OK。

Mac Bookから踏み台経由でサービス用インスタンスにアクセスしたい!

Jump host経由でログインできるように
Mac Book Proの~/.ssh/configを以下のように設定する

Host jump
  Hostname {踏み台用サーバのEIP}
  User ubuntu

Host *.internal
  User ubuntu
  ProxyCommand ssh jump nc %h %p

こうするとMac Book ProのTerminalから

> ssh ip-10-0-11-233.ap-northeast-1.compute.internal

とするとログインできる。

RDSインスタンス立ち上げ

Subnet Groupを作る

まずは作らないと始まらない。作る。

db-security-group.png

Security Groupを作る

basic-rdsという名前で作る

  • inbound

3306のみサービス向けの接続を許可。

Type Protocol Portrange Source
Custom TCP Rule TCP 3306 basic-service
  • outbound

すべて許可。

Type Protocol Portrange Source
All traffic All All 0.0.0.0/0

instance立ち上げ

Multi AZ有効という形でインスタンスを作っておく。

rds.png

Route 53にてinternal DNSを設定する

basic-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.comと割り当てられているRDS向けのENDPointをRoute 53にてbasic-rds.serviceと設定する。

r53-1.png

r53-2.png

Security Groupのルール更新

basic-rdsとの疎通が行えるよう、設定を追加する

basic-service

  • inbound

basic-rdsからのinboundについてすべてのトラフィックを許可

Type Protocol Portrange Source
All traffic All All basic-rds
  • outbound

basic-rdsへのoutboundについてすべてのトラフィックを許可

Type Protocol Portrange Source
All traffic All All basic-rds

basic-rds

  • inbound

basic-serviceからの3306ポート(TCP)に対するトラフィックについて制限しない。

Type Protocol Portrange Source
MYSQL/Aurora TCP 3306 basic-service
  • outbound

変更なし

疎通確認

  • internal DNSとして設定した後のアクセス確認

アクセス確認をサービス向けEC2インスタンス、basic-public-oneからRDSの3306番ポートにアクセスできるか確認する

> ssh ip-10-0-11-233.ap-northeast-1.compute.internal
> telnet basic-rds.service 3306
Trying 10.0.15.52...
Connected to ec2-**************.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
N
5.6.23-log'gM)&~n.5?ajon\_K:~1spmysql_native_password

疎通はできる。ログインできるかな?mysql-clientをインストールして、確認する。

> sudo apt-get update
> sudo apt-get install mysql-client-5.6
> mysql -h basic-rds.service -u root -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| basic_service      |
| innodb             |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

問題ないようだ :thumbsup:

ElastiCacheインスタンス立ち上げ

CacheSubnetGroupを作る

CacheSubnetGroupを作る。
設定するのは、elasticache用に割り当てたSubnet 2つ。

cache-subnet-group.png

Security Groupを作成する

basic-redisというSecurity Groupを作成する

  • inbound

basic-service側のinboundについて、6379ポート(TCP)を許可する

Type Protocol Portrange Source
All traffic All All basic-redis
Custom TCP Rule TCP 6379 basic-service
  • outbound

basic-service側へのoutboundは、すべてのトラフィックを許可する

Type Protocol Portrange Source
All traffic All All basic-redis
All traffic All All basic-service

basic-service Security Groupの設定追加

basic-redisに対する疎通が行えるように設定を追加する。

  • inbound

basic-redisからのtrafficについてすべてのプロトコルを許可する。

Type Protocol Portrange Source
All traffic All All basic-redis
  • outbound

basic-redisに対して、6379ポート(TCP)のみ出ることを許可する

Type Protocol Portrange Source
Custom TCP Rule TCP 6379 basic-redis

Cache Clusterを作成する

Redis用として作成する。先ほど作ったSecurity Groupを指定。

cache-cluster-1.png

こんな感じの設定で作成。

cache-cluster-2.png

Route 53にReplication GroupのEndpointを登録

登録する。

elasticache-1.png

elasticache-2.png

疎通確認

basic-public-oneから疎通できるか確認

> ssh ip-10-0-11-233.ap-northeast-1.compute.internal
> telnet basic-redis.service 6379
Trying 10.0.16.17...
Connected to basic-redis-001.*****.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
INFO

INFO
$1931
# Server
redis_version:2.8.23
redis_git_sha1:0
redis_git_dirty:0
redis_build_id:0
redis_mode:standalone
os:Amazon ElastiCache
arch_bits:64
multiplexing_api:epoll
gcc_version:0.0.0
process_id:1
...

疎通ok :thumbsup:

ELBを作る

ELBを作る。くっつけるEC2は予め作っておいた
basic-public-one(AZはA)basic-public-two(AZはC)を選択する。

elb-1.png

Security Groupの設定を更新

basic-elb

ELB用のSecurity Groupの設定を以下の状態に更新する。

  • inbound

basic-serviceからのinboundはすべて許可。
80ポート(TCP)についてはすべてのホストからの疎通を許可。

Type Protocol Portrange Source
HTTP TCP 80 0.0.0.0/0
All traffic All All basic-service
  • outbound

outboundはすべてのプロトコルを許可。

Type Protocol Portrange Source
All traffic All All 0.0.0.0/0

basic-service

  • inbound

basic-elbからの80ポート(TCP)inboundを許可する

インスタンスのHealthCheckが通るようにする

nginxをインストールし、ELB側がEC2インスタンス(2つ)と疎通が取れるようにしなければいけない。

  • basic-public-one
> ssh ip-10-0-11-233.ap-northeast-1.compute.internal
> sudo apt-get update
> sudo apt-get install nginx
  • basic-public-two
> ssh ip-10-0-12-64.ap-northeast-1.compute.internal
> sudo apt-get update
> sudo apt-get install nginx

ELB側がEC2インスタンスと疎通が取れてるか確認

  • ECインスタンスのaccess.logを見る。
10.0.0.55 - - [03/Jan/2016:03:24:24 +0000] "GET /index.html HTTP/1.1" 200 612 "-" "ELB-HealthChecker/1.0"
10.0.10.6 - - [03/Jan/2016:03:24:25 +0000] "GET /index.html HTTP/1.1" 200 612 "-" "ELB-HealthChecker/1.0"
  • ELBのステータスを確認する

elb-3.png

問題なし :thumbsup:

実際にアクセスできるか確認

ELBのエンドポイントに対し、ブラウザからアクセスをする。

web.png

出てきた!

※ここで本当はELBのエンドポイントをRoute 53に対して登録し、
ドメインと結びつける作業が必要だが、今回は割愛。

NetworkACLを作る

NetworkACLを各Subnet用、目的別につくる。
特定IPアドレスからのアクセス拒否などに対応するため。

inbound/outboundについて

すべてのNetwork ACLについて以下の形にする。
3306ポートで絞るなどはSecurity Group頼み。

  • inbound
Rule Type Protocol PortRange Source Allow/Deny
30000 ALL Traffic ALL ALL 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY
  • outbound
Rule Type Protocol PortRange Source Allow/Deny
30000 ALL Traffic ALL ALL 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY

作成したNetwork ACLのSubnet Associations

作成したNetwork ACLと、Subnet Associations(関連)について。

  • nat-gateway
Subnet CIDR
managed-nat-gateway-a 10.0.0.0/27
  • jump-hosts
Subnet CIDR
basic-ec2-jump-hosts 10.0.5.0/27
  • basic-rds
Subnet CIDR
basic-rds-a 10.0.15.0/27
basic-rds-c 10.0.15.32/27
  • basic-elb
Subnet CIDR
basic-elb-a 10.0.10.0/27
basic-elb-c 10.0.10.32/27
  • basic-elasticache
Subnet CIDR
basic-elb-c 10.0.16.0/27
basic-elb-a 10.0.16.32/27
  • basic-ec2
Subnet CIDR
basic-elb-c 10.0.11.0/24
basic-elb-a 10.0.12.0/24

こんな感じ。

注意点

Subnetのサイズ設定について

Subnetについてケチケチ/27で切っているけど、本当に伸びるサービス、永遠に続けるつもりがあるようなサービスに対してはやめたほうが良い。AWSの場合、Subnetについて 5つのアドレスを予約アドレスとして確保されるため。32個のアドレスのうち、5つが予約済みとなるため/27で切ると27個のアドレスしか利用できない。

以下を参考のこと。

サブネットのサイズ設定

サブネットのサイズ設定より引用
各サブネット CIDR ブロックの最初の 4 つの IP アドレスと最後の IP アドレスは使用できず、
インスタンスに割り当てることができません。
たとえば、CIDR ブロック 10.0.0.0/24 を持つサブネットの場合、
次の 5 つの IP アドレスが予約されます。

10.0.0.0: ネットワークアドレスです。
10.0.0.1: VPC ルーター用に AWS で予約されています。
10.0.0.2: Amazon が提供する DNS へのマッピング用に AWS で予約されています。
10.0.0.3: 将来の利用のために AWS で予約されています。
10.0.0.255: ネットワークブロードキャストアドレスです。VPC ではブロードキャストがサポートされないため、このアドレスを予約します。

ここでのネットワーク構築はあくまで例。m(_ _)m

66
69
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
66
69