Da Vinci Studio Blog

株式会社 Da Vinci Studio は 2023 年 7 月に株式会社 Zaim と統合し、株式会社くふう AI スタジオになりました

AWS におけるサブネットについておさらい

株式会社くふう AI スタジオ インフラ基盤部 SRE チームの林田です。
今回はAWSを使ってアプリケーションを開発する際、切っても切り離せないサブネットについて改めておさらいしてみようと思います。


突然ですが皆さんパブリックサブネットとプライベートサブネットの違いについて正確に答えられるでしょうか?
また、実はそれ以外のサブネットも存在することをご存知でしょうか?


試しに AWS コンソールから、サブネットの作成を試みてみます。
ここで、わかることは「サブネット作成時」には特にパブリックプライベートかの指定は出来ないということですね~



次に IaC ツールである terraform でサブネットを作る方法も見てみます。

registry.terraform.io

※ ソースを抜粋

resource "aws_subnet" "main" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"

  tags = {
    Name = "Main"
  }
}

ここでも特にパブリックプライベートかの指定は出来ないようです。


じゃあどうすれば?
もしあなたが上司に「パブリックサブネットとプライベートサブネット作っておいて」と言われたらどうしますか?


パブリックサブネットとプライベートサブネットの定義

AWS 公式ドキュメントで公式な定義がないか探してみました。
すると AWS 謹製の IaC ツールである AWS CDK の API リファレンスが参考になりました。

docs.aws.amazon.com


上記リンクの SubnetType という列挙型に定義されている定数にて下記の4種類のサブネットの定義が書かれています。

Name Description
PRIVATE_ISOLATED 分離サブネットはトラフィックをインターネット (この VPC 内) にルーティングしないため、NAT ゲートウェイを必要としません。
PRIVATE_WITH_EGRESS インターネットにルーティングするが、その逆は行わないサブネット。
PRIVATE_WITH_NAT (NAT ゲートウェイ経由で) インターネットにルーティングするサブネットですが、その逆はありません。
PUBLIC インターネットに接続されたサブネット。


つまりパブリックサブネットとは「サブネットからインターネットへの進出、逆にインターネットからサブネットへの進入どちらも可能なサブネット」ということになります。


そうではないサブネットがプライベートサブネットで、図を見る限り3種類あるようです。
PRIVATE_WITH_NAT と PRIVATE_WITH_EGRESS の定義が同じように見えますが、前者は NAT Gateway の利用が前提となっているのでしょうか。

つまりあなたが上司に「プライベートサブネットを作って」と依頼されたら
「それは、PRIVATE_ISOLATED サブネットですか? PRIVATE_WITH_EGRESS サブネットですか?それとも PRIVATE_WITH_NAT サブネットですか?」と聞き返してあげると
「お!こいつサブネットのことが解っているな!」と、思ってもらえるかも知れません(笑)


ちなみに AWS CDK では、ネットワーク構成を自分で実装しなくっても
上記の定数を指定するだけで自動的に定数に合った構成を作ってくれます。


せっかくなので AWS CDK を使ってそれぞれのサブネットをシュッと作ってみてどのようなネットワーク構成が作られるか確認してみます。


4種類のサブネットを作成するプログラムを書いてデプロイしてみます。

    const vpc = new ec2.Vpc(this, 'TheVPC', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      natGateways: 1, 
      subnetConfiguration: [
       {
          cidrMask: 24,
          subnetType: ec2.SubnetType.PUBLIC,
          name: "PUBLIC",
        },
       {
          cidrMask: 24,
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
          name: "PRIVATE_ISOLATED",
        },
       {
          cidrMask: 24,
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
          name: "PRIVATE_WITH_EGRESS",
        },
       {
          cidrMask: 24,
          subnetType: ec2.SubnetType.PRIVATE_WITH_NAT,
          name: "PRIVATE_WITH_NAT",
        },
      ],
    })


cdk deploy


デプロイが完了するとアベイラビリティゾーンごとにぞろぞろとサブネットが作られました。
それぞれのネットワーク構成(ルートテーブル)を確認していきます。


PUBLIC サブネットのネットワーク構成

至ってシンプルで、インターネットゲートウェイと関連付いていることにより
「サブネットからインターネットへの進出、逆にインターネットからサブネットへの進入どちらも可能なサブネット」になっていることが特徴です。


PRIVATE_ISOLATED サブネットのネットワーク構成

こちらは更にシンプルでした。
local としか通信出来ない文字通り完全に孤立した(ISOLATED)状態になっています。


PRIVATE_WITH_NAT サブネットのネットワーク構成

こちらもそんなに複雑ではなく、その名の通り NAT Gateway を介してインターネットへ進出するようです。

PRIVATE_WITH_EGRESS サブネットのネットワーク構成

意外だったのはこちらで、PRIVATE_WITH_NAT と同様に NAT Gateway を介してインターネットへ進出するようです。
つまり PRIVATE_WITH_NAT と特に違いがありませんでした。
今後 NAT Gateway 以外の進出手段が出てきたら何か変わるのかも知れません。


まとめ

  • パブリックサブネットかプライベートサブネットかはネットワーク構成によって変わる。

  • サブネットには4つの種類がある。


いかがだったでしょうか。
普段なんとなくサブネットを作られている方も、良いおさらいになったのではないかと思います。


くふう AI スタジオでは、働く仲間を募集しています!
興味のある方は こちら からお気軽にお問い合わせ下さい。

open.talentio.com