AWSソリューションアーキテクト・アソシエイト EC2・VPC編

  • EC2
  • VPC
  • EC2とVPCはAWSのサービスの中でも超基本となるサービスです。言ってみればEC2はサーバーでVPCはネットワークです。

    私は以下のような『My AWS System』を構築して、EC2とVPCについて勉強しました。

    これくらいの簡単な構成が構築できるようになれば、EC2やVPCの概念はほぼ理解できている状態になります。

    ※以下の内容はネットワークの基本知識があることを前提に記載しています。プライベートIPアドレスの細かい設定方法などについては触れていません。

    『My AWS System』

    aws_ec2_01

    構成はいたってシンプルです。EC2を2台配置して、それぞれパブリックサブネット、プライベートサブネットに配置します。

    以下の要件を満たすよう構築します。

    • パブリックサブネットのEC2へのアクセスは自宅PCからのアクセスのみを許可する。
    • プライベートサブネットへのアクセスは、パブリックサブネットのみを許可する。
    • プライベートサブネットから外部インターネットへのアクセスは、パブリックサブネットのEC2(proxy)を必ず経由する。
    • S3へのアクセスは外部のインターネットを経由させない

    ネットワーク設定

    いきなりEC2は起動できません。EC2を構築する前にネットワーク周りの準備をしておく必要があります。なぜなら、EC2構築の際に、

    • どこのVPCに所属させるか
    • どこのサブネットに所属させるか
    • どこのセキュリティグループに所属させるかどうか
    • EIP(Elastic IP アドレス)を付与するかどうか

    を指定しなければ、EC2を起動させることは出来ません。

    VPC / サブネット / セキュリティグループ

    基本的なことは公式ドキュメントを参照ください。ここでは、私がどんなネットワーク構成で『My AWS System』を構築して、AWSのネットワークを理解したか解説します。

    VPCとサブネットの関係は容易に理解できると思います。VPCの中にサブネットが複数存在することができます。

    私の『My AWS System』では以下のルールでサブネットをセキュリティグループを設計しています。

    aws_ec2_02

    ポイントは、"1サブネット:1セキュリティグループ" です。サブネット内のEC2に対しては、全て同じセキュリティグループを適用します。

    パブリックサブネットに対してキュリティグループを1つ作成します。プライベートサブネットに対してセキュリティグループを1つ作成します。

    インバウンド通信の許可設定

    パブリックサブネットのセキュリティグループの設定では以下のインバウンド通信を許可します。

    • 自宅IPアドレスからのSSH接続
    • "プライベートサブネットのセキュリティグループ" からのHTTPS / HTTP 通信

    原則、どこのセキュリティグループからの通信を許可するか、というルールを設定していきます。そうすることで、セキュリティグループの設計がそのままネットワークセキュリティの設定となりますので、管理がしやすくなります。

    続いて、プライベートサブネットのセキュリティグループの設定では以下の通信を許可します。

    • "パブリックサブネットのセキュリティグループ" からのSSH接続

    上記の設定を行うことで、パブリックサブネット内のEC2は自宅PCからのSSH接続と、プライベートサブネットからのHTTPS/HTTP通信しか受け付けなくなります。プライベートサブネットのEC2では、パブリックサブネットのEC2からのSSH接続しか受け付けなくなります。

    ルートテーブル / IGW(Internet GateWay) / VPCエンドポイント

    『My AWS System』の構築のためには、VPCとサブネットのルートテーブルを編集しなければいけません。

    1. IGWを作成し、VPCにアタッチする。
    2. S3のVPCエンドポイントを作成してVPCにアタッチする。
    3. VPCのルートテーブルにIGWを設定する。
    4. パブリックサブネットのルートテーブルにIGWとS3のVPCエンドポイントを設定する。

    VPCのルートテーブルは以下のようになります。

    rout_table_01

    パブリックサブネットのルートテーブルは以下のようになります。

    rout_table_02

    EC2のセットアップと稼働確認

    EC2のセットアップ方法については、インターネットを探せばいくらでも出てきます。以下に掲載しているコマンドについては参考程度に見てください。

    パブリックサブネットのEC2をセットアップ

    1. OSはAmazonLinux2の最新バージョンを選択
    2. インスタンスタイプは "t2-micro(無料枠)" を選択
    3. ディスクは30GBの汎用SSD
    4. VPC、サブネット、セキュリティグループは上記で作成したものをセット
    5. タグは任意に設定
    6. キーペアは持っていなければ、新しく作成
    7. 以上、すべての設定内容を確認しEC2を起動

    EC2が起動したら自宅PCからEC2に対してSSH接続します。その際に認証鍵(キーペア)を使うことを忘れないようにしましょう。

    私がEC2構築で行っている初期設定は以下です。

    $ sudo yum update -y # OSを最新の状態にアップデート $ yum install -y curl # curlをインストール $ yum install -y unzip # unzipをインストール $ sudo vi /etc/sysconfig/clock # 日本時間を設定 ZONE="Asia/Tokyo" UTC=false $ sudo cp /usr/share/zoneinfo/Japan /etc/localtime $ date # 日本時間になっていることを確認 $ sudo vi /etc/sysconfig/i18n # 文字コードを日本語に変更 LANG=ja_JP.UTF-8 $ echo "あいうえお" # 日本語の出力が出来ることを確認 $ sudo adduser emily01 # ユーザー追加 $ sudo passwd emily01 # ユーザーのパスワード作成 $ sudo passwd root # root のパスワード設定 $ su - # rootにスイッチ # cp -r /home/ec2-user/.ssh /home/emily01/ # 追加したユーザーのSSH認証設定 # chown -R emily01.emily01 /home/emily01/.ssh # curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" # AWS CLI install # unzip awscliv2.zip # ./aws/install # reboot # 再起動し、作成したユーザーで再度SSHログイン $ su - # rootにスイッチ # userdel ec2-user # ec2-userの削除(AWS推奨) # exit # 終了

    上記の初期設定後のAMIを取得しておけば、今後はEC2を立てる際、初期設定後の状態で起動させることも出来ます。

    proxy(squid)の設定

    proxyはOSSのsquidを使用します。proxy環境を構築することでネットワークの設定に詳しくなれます。

    $ yum install squid -y # squid のインストール $ vi /etc/squid/squid.conf # 設定ファイルの更新 ------------------------ /etc/squid/squid.conf ------------------------ # 接続クライアントのネットワークを指定 acl localnet src 10.112.0.0/16 # VPCのネットワークを記載 # 許可するポートを指定 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # /etc/squid/blacklistファイルに拒否するドメインを記載 acl blacklist dstdomain "/etc/squid/blacklist" # アクセス制御設定 http_access deny blacklist http_access deny !Safe_ports # Safe_portsで指定したポート以外を拒否 http_access deny CONNECT !Safe_ports # Safe_ports # キャッシュマネージャーへのアクセスはlocalhostのみ許可 http_access allow localhost manager http_access deny manager # 接続クライアントの許可設定 http_access allow localnet # localnetで指定したネットワークを許可 http_access allow localhost # localhostを許可 http_access deny all # すべてを拒否 # 待ち受けポートを8181に指定 http_port 8181 # proxyのportを設定 # キャッシュの設定 cache_mem 256 MB cache_dir ufs /var/spool/squid 200 16 256 # coredump出力先を設定 coredump_dir /var/spool/squid #キャッシュ更新間隔の設定 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 # エラーページにバージョンを表示させない httpd_suppress_version_string on # ログフォーマット # logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %a %[ui %[un [%{%Y-%m-%d %H:%M:%S %z}tl] "%rm %ru HTTP/%rv" %>Hs %h" "%{User-Agent}>h" %Ss:%Sh access_log /var/log/squid/access.log koizumi ------------------------ /etc/squid/squid.conf ------------------------ $ systemctl start squid # サービス開始 $ systemctl enable squid # 自動起動設定

    これにより、パブリックサブネットのEC2のセットアップは完了です。続いて、プライベートサブネットのEC2をセットアップします。

    プライベートサブネットのEC2をセットアップ

    手順は先ほどと同様です。異なるところは、proxyを経由しなければ外のインターネットと通信できないことです。

    セットアップの手順にあるコマンドで外部との通信を使用するのは『yum』『curl』です。また、今後AWS全般の操作で使用する『AWS CLI』もproxyを通す必要があります。

    以下に、『yum』『curl』『AWS CLI』のコマンド実行時にproxyを通すよう設定する方法を記載しておきます。

    $ sudo /etc/yum.conf # yum コマンド実行前に proxy設定 proxy=http://10.112.4.78:8181 # proxy サーバーの ip address と port 番号を指定 # vi /etc/profile # AWS CLI用 環境設定ファイルにproxyの情報を追記 export HTTPS_PROXY=https://10.112.4.78:8181 # proxy サーバーの ip address と port 番号を指定 export NO_PROXY=169.254.169.254 # AWS Cli で必要な設定 # vi ~/.curlrc # curl コマンド実行前に proxy設定 proxy=10.112.4.78:8181 # proxy サーバーの ip address と port 番号を指定

    上記でEC2のセットアップは完了です。

    稼働確認

    proxy サーバーではログ(/var/log/squid/access.log)を出力するよう設定しています。プライベートサブネットのEC2から、外部ネットワークへの通信を試みて、ログにその情報が追記されて行っているか確認しましょう、

    プライベートサブネットのEC2で実行 $ curl google.com <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML> パブリックサブネットのEC2でsquidのログを参照 $ cat /var/log/squid/access.log 10.112.2.167 - - [2020-05-16 13:38:38 +0900] "GET http://google.com/ HTTP/1.1" 301 646 "-" "curl/7.61.1" TCP_MISS:HIER_DIRECT

    EC2とS3のネットワーク設定

    S3というサービスはグローバルサービスと呼ばれています。グローバルサービスとは、VPCの中に存在するサービスではなく、インターネットによるアクセスを前提としたサービスであるということです。

    ですが、S3への通信ルートは、2系統存在します。1つは外のインターネットを経由するルート、1つはVPCとS3で直接に通信するルートです。

    後者の通信を可能とするのが、VPCエンドポイントです。こちらはすでに設定済みですね。改めて、パブリックサブネットのルートテーブルを参照してください。

    S3のVPCエンドポイントがルートテーブルに記述されていれば問題ありません。ネットワークの設定はこれで完了です。

    S3のアクセスコントロール

    実は、ルートテーブルにS3エンドポイントを設定しただけでは、EC2からS3へアクセスすることは出来ません。

    なぜなら、S3はデフォルト設定では誰とも通信できない状態だからです。

    S3のアクセスコントロールは、二つの方法で決定されます。それは、アクセスされるS3バケットのバケットポリシー、アクセスする側のEC2インスタンスの持つロールです。

    『My AWS System』は同一のAWSアカウント内でS3もVPCも構築しているので、S3のバケットポリシーまたは、EC2インスタンスの持つロールのいずれかによって、許可された場合のみ、EC2はS3バケットへアクセスが可能となります。

    詳しくは『AWSソリューションアーキテクト・アソシエイト S3編』で解説します。

    EC2とネットワーク

    以上が、EC2とVPCの基本です。この基本さえ分かっていれば、EC2とRDS、EC2とRedshift、S3とkinesis、その他サービスを用いたネットワークの設定は理解することが出来ます。

    グローバルサービスはS3だけではありません。Dynamodb、ElastiCache、Elasticsearch Serviceなどなど、たくさん存在します。これらグローバルサービスのネットワーク設定も基本はS3と同じです。

    要は外のインターネット経由で接続するか、VPCエンドポイントが用意されていれば、それをVPCにアタッチして使用するかどうかです。

    また、EC2のインスタンス毎にセキュリティグループを作成することで、細かなアクセスコントロールも可能になりますよね。

    まずは、本記事で書いたような簡単な構成が自分で "理解して" 構築できるようになるだけでも、かなり応用が効くようになります。

  • EC2
  • VPC