初めに
今回、AWS VPC周り主な機能について、ご説明させていただきます。
主な内容
- Internet GateWay(IGW)
- Virtual Private GateWay
- Routing Table
- Network Access Control lists(NACL)
- Security Group(SG)
- Public Subnets
- Private Subnets
- Nat Gateway
- Customer GateWay
- VPC Endpints
構成図
VPCを構築
以下の項目を設定する
IPv4 CIDR
10.0.0.0/27
ネットマスク:11111111.11111111.11111111.11100000
使用可能なIP:2^5=32個
VPCのルートテーブルとNACL確認
VPCを作成すると自動的にvpcのメインルートテーブルとメインネットACLが作成してくれる
ルートテーブル
各ルートテーブルには、VPC 内で通信を有効にするローカルルートが含まれます。このルートは、デフォルトですべてのルートテーブルに追加されます。ルートを変更または削除することはできません。
NACL(Network Access Control List)
デフォルトのネットワーク ACL は、すべてのトラフィックが、関連するサブネットを出入りすることを許可するように設定されます。各ネットワーク ACL にも、ルール番号がアスタリスクのルールが含まれます。このルールによって、パケットが他のいずれの番号のルールとも一致しない場合は、確実に拒否されます。
NACLインバウンドルール
アウトボウンドルール
インターネットゲートウェイを作成
インターネットゲートウェイをVPCにアタッチ
インターネットゲートウェイをvpcルートテーブルにルート追加
サブネットを作成
vpc ipv4CIDR
ネットマスク:11111111.11111111.11111111.11100000
使用可能IP範囲
11111111.11111111.11111111.11100000から
11111111.11111111.11111111.11111111まで
全部32個IPが使用可能です。
二つサブネットを作成します。半分半分で分けていきます。
private subnet
private subnet
11111111.11111111.11111111.11100000から
11111111.11111111.11111111.11101111まで
使用可能IP数:2^4 =16個
ブネットに割り当てる IP アドレスをすべて使用できません、各サブネットにおいて、Amazon が先頭の 4 つの IP アドレスを確保し、最後の 1 つの IP アドレスは、IP ネットワーキングの目的で確保されます。
使用できるIPアドレス数は11個です
ネットマスク:10.0.0.0/28
public subnet
11111111.11111111.11111111.11110000から
11111111.11111111.11111111.11111111まで
ネットマスク:10.0.0.16/28
論理使用可能IP数:2^4 =16個,AWSに5個専用IPを引いて、実は使用可能のIP数は11個です。
サブネットのルートテーブルを設定
パブリックサブネットとプライベートサブネットの違いは、インターネットゲートウェイとルーティングできるかどうかです。
private subentの専用ルートを設定
ルート
public subnetの専用ルートを設定
public subnetにEC2を起動するために、準備こと
- SG(security group)
デフォルトの VPC および作成した VPC には、デフォルトのセキュリティグループが適用されます。リソースによっては、リソースの作成時にセキュリティグループを関連付けない場合、デフォルトのセキュリティグループが関連付けられます。例えば、EC2 インスタンスを起動時にセキュリティグループを指定しない場合、デフォルトのセキュリティグループが関連付けられます。
デフォルトのセキュリティグループのルールは変更できます。デフォルトのセキュリティグループを削除することはできません。デフォルトのセキュリティグループを削除しようとした場合、Client.CannotDelete エラーが発生します。
今回カスタマイズセキュリティグループを使用させていただきます。
SG情報
アウトバウンドルール
アウトバウンドルール
public subnetにEC2を起動
- ゴール:EC2にApacheをインストールして、デフォルトページを切り替え
user data
#!/usr/bin/env bash
su ec2-user
sudo yum install httpd -y
sudo service httpd start
sudo su -c "cat > /var/www/html/index.html <<EOL
<html>
<head>
<meta charset="utf-8">
<title> call to Arms</title>
<style type="text/css"></style>
</head>
<body>
<img src="https://media.giphy.com/media/rgTB82z9P63fTGhxQo/giphy.gif" height="100%">
</body>
</html>
EOL"
1.AMIの選択
2.インスタンスタイプを選択
3.インスタンスの設定
4.ストレージの追加
5.タグの追加
- 全ての設置はデフォルトにします。
6.セキュリティグループの設定
- 事前に作成したセキュリティグループを選択
7.確認
- 各設定項目をチェックして、起動ボタンをクリックします。
- キーペアを選択(既存のキーペアを選択するか、新しいキーペアを作成するか)
- インスタンスの作成ボタンをクリックする
※ 自分は以前キーペアがあるので、既存のキーペアを選択します。
public subnetに起動したec2状況を確認
パブリックIPv4アドレスでアクセスしてみます。以下のgif表示されています。成功!
private subnetにEC2を起動
今回EC2がprivate subnetにいるので、公開IPv4アドレスがなくて、直接sshアクセスできないです。今回Systems Manager セッションマネージャーでアクセスします。
以下の記事を参照させていただきました。
EC2用IAMロールを作成
マネジメントコンソールから「iam」と検索して、「IAM」を選択します。
ユースケースの選択で「EC2」を選択して,他のAWSのサービスユースケースに「Systems Manager」を選択して次に進めます。
ポリシーの検索欄に、「AmazonSSMManagedInstanceCore」と入力し、表示されたポリシーを選択して次に進みます。
今回はタグなしで次に進みます。
名前と詳細を確認してロールを作成します。
private subnetにEC2を起動
マネジメントコンソールから「ec2」と検索して、「EC2」を選択します。
EC2ダッシュボードから「インスタンスを起動」をクリックします。
AMIはAmazon Linux 2 AMI (HVM)を選択します。
インスタンスタイプはt2.microを選択します。
インスタンスの詳細の設定では、ネットワーク、サブネット、IAMロールを編集します。
ストレージの追加とタグの追加はデフォルトにする
セキュリティグループは作成ずみの「SG-for-ec2-in-vpc-02」にします。
セッションマネージャーでアクセスするため、キーペアは不要です。
Systems Manager の VPCエンドポイントを作成します。
VPCエンドポイントにはセキュリティグループをアタッチする必要があるため、先にセキュリティグループを作成します。
マネジメントコンソールから「vpc」と検索して、「vpc」を選択します。
- インバウンドルールを設定(HTTPSをVPC CIDRで許可)
- アウトバンドルールを設定(デフォルトの全許可のまま)
- vpcを選択
今回作成するエンドポイントは以下の3つです。
・com.amazonaws.ap-northeast-1.ssm
・com.amazonaws.ap-northeast-1.ssmmessages
・com.amazonaws.ap-northeast-1.ec2messages
ひとまずcom.amazonaws.ap-northeast-1.ssmのエンドポイントを作成していきます。
エンドポイントの名前を入力します。
サービスにcom.amazonaws.ap-northeast-1.ssmを検索して、com.amazonaws.ap-northeast-1.ssmサービスを選択します。
今回作成したvpcを選択します。
プライベートDNS名の有効はデフォルトでチェックがついているので、そのままにしておきます。
プライベートサブネットを選択
ポリシーでアクセス制御もできますが、
今回はフルアクセスのままにしておきます。
作成直後は「保留中」となりますが、しばらくすると「使用可能」に変わります。
あとは残りのエンドポイントも同様の手順で作成します。
エンドポイントの選択以外は同様の手順なので、選択箇所以外は省略します。
問題
全てのエンドポイントを正しく作成した後、EC2にsession managerでアクセスしようと思いますが、接続ボタンが押せなかった。
以下の記事を調べたところ、デフォルトでは、SSM Agent は 2017.09 以降の Amazon Linux ベースの Amazon マシンイメージ (AMI) にインストールされます。SSM Agent は、Amazon Linux 2 AMI および Amazon Linux 2 ECS に最適化されたベース AMI にもデフォルトでインストールされます。最新の Amazon EKS 最適化 AMI では、SSM Agent が自動的にインストールされます。
今回プライベートサブネットに起動されたec2のインスタンスAMIはAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Typeです。
デフォルトでは、ec2にSSM Agentをインストールされてるはずなんです。なんで接続できないのは謎です。
プライベートサブネットなので、EC2に入れないから、確認もできなかった。
改善策
s3 エンドポイントの経由でプライベートサブネットにいるec2にSSM Agentをインストールさせます。
プライベートサブネットにいるec2のユーザーデータ
#!/bin/bash
cd /tmp
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
上のprivate subnetにEC2を起動手順と全部同じ、ユーザーデータだけを初期設定します。
ec2を起動後、セッションマネージャーで接続ボタンが押せるようになりました
s3エンドポイントでプライベート EC2からs3に接続
せっかくS3エンドポイントを作成したので、この部分S3エンドポイントを利用して、プライベート EC2からs3に接続していこうと思います。
セッションマネージャーでec2に接続し、既存s3リストを確認
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
以上のエラーが返してくれました。原因としてはec2のルールにs3のアクセス権限がないため、ec2のロールを修正します。
ロールを確認
ロール名は「private-ec2-role」です、ロールリンクをクリックして、s3アクセス権限を追加します。
アクセス許可を追加ボタンをクリックします。ポリシーをアタッチする。
[s3]を検索して、一旦[AmazonS3FullAccess]ポリシーを追加します。
既存のs3リストが全部表示できるようになりました。成功!
NATを使用して、プライベートEC2を外部アクセス
日常の仕事でプライベートサブネット内のインスタンスのソフトウエア、ライブラリをインストールしたり、開発言語環境を構築したり、するなどタスクがあると思います。
NAT ゲートウェイは、ネットワークアドレス変換 (NAT) サービスです。NAT ゲートウェイを使用すると、プライベートサブネット内のインスタンスは VPC 外のサービスに接続できますが、外部サービスはそれらのインスタンスとの接続を開始できません。
プライベートEC2なので、googleにpingして、通らないことを確認しました。
NAT ゲートウェイを作成
- NAT ゲートウェイ名前を入力する
- サブネットを選択(必ずパブリクサブネットを選択)
- 接続タイプ:パブリック
- Elastic IPを割り当てる
プライベートサブネットのルートテーブルを更新
NATゲートウェイができたらプライベートサブネットのルートテーブルにNATゲートウェイのルーティングを追加します。