AWSのネットワーク設定
について、最近VPC1つあたりSecurity Groupの設定が500まで上限が開放されたのでこうやったほうがいいかな、というのを書いとく。
かなり長くなってしまった。
VPCを作る
数多あるAWSサービスからVPCを選択してVPCを作る。これがないと始まらない。
PrivateDNSでホストを引けるようにしとく
PrivateDNSでホスト名を引けるようにするため、
VPCのEdit DNS HostnamesでEnableに設定する。
Managed NAT gateway用のsubnetを切る
Managed NAT gatewayが先日発表されたので、それを使いたい。
そのためにSubnetを切る。
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 |
図にすると...
こんな感じ。基本的な感じ。
ELBについては/27の広さがないと作れない状態だったりする。それでも狭いけど...。
Subnetを作成
こつこつ作成する...絵を起こすのはアレなのでできた結果のスクショ。
作成したSubnetをRoute Tableと結びつけ、public/privateなネットワークを構築
Internet Gatewayを作る
Internet Gatewayを作成し、先ほど作成したVPCにattachする。
Route Tableを作成する
public用
インターネッツと通信するためのもの。
Routesの設定
作成したInternetGatewayをDestination 0.0.0.0/0に対してくっつける。
これでインターネットから通信を抜け出せるようになる。
Subnet Associationsの設定
インターネッツとふれあうであろうSubnetを設定する。
private用
内部で通信すれば良いもの。RDSやEC2インスタンス、ElastiCacheなど。
Routesの設定
作成したNatInstanceをDestination 0.0.0.0/0に対してくっつける。
ELBやJump hostからの通信はこのNATを使って名前解決を行う。
Subnet Associationsの設定
インターネッツと触れ合わないであろうSubnetを設定する。
Managed NAT gatewayを立てる
NAT GatewaysからCreate NAT Gatewayボタンを押す。
Subnetはさっき作ったやつを選択。
EIPも作成してしまおう。Managed NAT Gatewayができた。
作成時に自動的に割り当てられた!楽だ。
ELBやらEC2など構築
していく。
Keypairの登録
を予めしておく。
NETROWK & SECURITY > Key Pairs
から作成しとく。
EC2インスタンスの作成
AZ AとCにそれぞれ1台ずつ作る。
利用するAMIはUbuntu 64bit。
お金が勿体無いので最近使えるようになったt2.nanoインスタンスで構築していく。
インスタンス作成時にEC2インスタンスに対するIAM Roleを設定する
今勤めてる会社の若手からそうしたほうがいいっすよ、と教えられたのでしておく。
IAMは作るけど、特に何も設定しない。何かが起きた時にアクセスできる権限を絞れるようにする。
何も設定しない。
...ここまで書いてわかったけどEC2インスタンスを作る前にIAM Role作らないと
Viewに値が反映されないんだった... orz
リロードして設定する。
サービス用のSecurity Groupを作っておく
あとで全体で利用できるSecurity Groupを作成するが、いまんところ
サービス用のSecurity Groupを作っとく。
そしてそのままEC2インスタンスを立ち上げる。
(Key PairをIAM Roleからアップロードしておくことを忘れずに...)
EC2インスタンス作成時に作成したSecurity Groupのルールを変更する
basic-service としておく。そしてbasic-service Security Groupが設定されていたら
inbound/outboundかかわらずすべてのパケットを通す、というようにしてしまう。
普遍的に利用できる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用)として設定し、疎通可能にする
- IAM Roleにて、ec2-jump-hostsを作成し、EC2インスタンスに適用する。
EIPを付ける
EIPを付けないとインターネッツ外からアクセスできないので、EIPを払い出し、
作成したEC2インスタンスに結びつけておく。
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を作る
まずは作らないと始まらない。作る。
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有効という形でインスタンスを作っておく。
Route 53にてinternal DNSを設定する
basic-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.comと割り当てられているRDS向けのENDPointをRoute 53にてbasic-rds.serviceと設定する。
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)
問題ないようだ
ElastiCacheインスタンス立ち上げ
CacheSubnetGroupを作る
CacheSubnetGroupを作る。
設定するのは、elasticache用に割り当てたSubnet 2つ。
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を指定。
こんな感じの設定で作成。
Route 53にReplication GroupのEndpointを登録
登録する。
疎通確認
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
ELBを作る
ELBを作る。くっつけるEC2は予め作っておいた
**basic-public-one(AZはA)とbasic-public-two(AZはC)**を選択する。
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のエンドポイントに対し、ブラウザからアクセスをする。
出てきた!
※ここで本当は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