コンテンツにスキップ

network pattern

概要

network patternモジュールでは、AWS環境内で基本となるネットワーク環境(Amazon VPCやサブネット等)を構築します。

想定する適用対象環境

network patternは、Delivery環境およびRuntime環境のいずれでも使用されることを想定しています。

依存するpattern

network patternは、他のpatternの実行結果に依存しません。独立して実行できます。

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
Amazon VPC 他のAmazon VPC内で動作するリソースの基盤となる、独立した仮想ネットワークを構築します
サブネット パブリックサブネットおよびプライベートサブネットを構築します
インターネットゲートウェイ インターネットとの通信を可能にするコンポーネントで、パブリックサブネットのルートテーブルに結び付けられます
NAT ゲートウェイ プライベートサブネットにあるリソースから、インターネットへの通信が可能になるコンポーネント
Elastic IP アドレス 静的なパブリックIPアドレス。network patternでは、NAT ゲートウェイに結び付けられます
ルートテーブル パブリックサブネット、プライベートサブネットそれぞれに作成され、ネットワーク経路を設定します
VPCエンドポイント 特定のサービス(ECR、S3、CloudWatch Logs)への通信経路をインターネットを経由しないAWSに閉じた経路にします

モジュールの理解に向けて

Amazon VPCおよび、その関連するリソースを用いることで、AWS環境内に独自のネットワーク環境を構築できます。

network patternではサブネットの基本に従い、Amazon VPCおよび関連リソースを構築します。

ℹ️ VPC とサブネットの基本

network patternではリージョンおよびアベイラビリティゾーンを指定して、Amazon VPC、サブネットを作成します。
サブネットには、パブリックサブネット、プライベートサブネットの2種類があります。
これが、network patternで構築されるリソースの基本的なセットになります。

各サブネットは、アベイラビリティゾーン内に含まれます。

VPCとAZ

network patternでは、アベイラビリティゾーンの指定とサブネットの指定はリストのインデックスを合わせて指定する必要があります。

たとえば、以下のコードを例に挙げます。

  availability_zones = ["ap-northeast-1a", "ap-northeast-1c"]

  public_subnets             = ["10.51.1.0/24", "10.51.2.0/24"]
  private_subnets            = ["10.51.3.0/24", "10.51.4.0/24"]

この例では、アベイラビリティゾーンと含まれるサブネットの関係は以下のようになります。

  • アベイラビリティゾーンap-northeast-1a内に含まれるサブネット
    • パブリックサブネット10.51.1.0/24、プライベートサブネット10.51.3.0/24
  • アベイラビリティゾーンap-northeast-1c内に含まれるサブネット
    • パブリックサブネット10.51.2.0/24、プライベートサブネット10.51.4.0/24

ここで、パブリックサブネットおよびプライベートサブネットの定義は、以下のようになります。

  • パブリックサブネット … トラフィックがインターネットゲートウェイにルーティングされるサブネット
  • プライベートサブネット … インターネットゲートウェイへのルートがないサブネット

パブリックサブネットおよびプライベートサブネット

パブリックサブネットには、インターネットからのトラフィックを直接受けるリソースが配置されます。主たる例は、ロードバランサーです。

プライベートサブネットには、インターネットからのトラフィックを直接受けないリソースが配置されます。主にコンテナオーケストレーションサービスや、データベースなどが該当します。

サービスを構築する際に、Amazon VPC内に配置するリソースのうち、インターネットからのトラフィックを直接受ける必要があるものは非常に限られます。このため、リソースを作成する際には、まずプライベートサブネットに配置することを検討してください。

プライベートサブネットに配置されるリソースからのインターネットに向けたアウトバウンドに関しては、NAT ゲートウェイを使用して通信できます。外部のAPIへのアクセスやコンテナイメージのダウンロードなどを行うリソースについては、必要な範囲のアウトバウンドを許可するようにセキュリティグループを設定してください。

NAT ゲートウェイの配置先は、パブリックサブネットと同じ値を指定します。

  public_subnets             = ["10.51.1.0/24", "10.51.2.0/24"]
  ...
  nat_gateway_deploy_subnets = ["10.51.1.0/24", "10.51.2.0/24"]

AWSのデフォルトではECRやS3などのAWSサービスはVPC内からのアクセスでもインターネットを経由した接続となります。 これはセキュリティおよびコストの観点で良くありません。 network patternでは以下サービスへのアクセスをAWS内に閉じた通信となるようにVPCエンドポイントを作成します。

  • ECR
  • S3
  • CloudWatch Logs

プライベートリンク

異なるVPC間を接続するVPCピアリングを行う場合、vpc_peering patternを使用します。 たとえば、サービス用のVPCと仮想セキュアルーム用のVPCを分ける場合にVPCピアリングを行います。 VPCピアリングを作成した後、各VPC内で接続先VPCへのルーティングを設定する必要があります。 network patternではこの接続先VPCへのルーティングも設定できます。 このルーティング設定はピア接続する相互のVPCに行ってください。

なお、この設定はvpc_peering pattern実行後でないとできないため、network patternを再applyして設定します。

サンプルコード

network patternを使用したサンプルコードを、以下に記載します。

module "network" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/network?ref=v0.2.6"

  name = "epona-runtime-production-network"

  cidr_block = "10.51.0.0/16"

  availability_zones = ["ap-northeast-1a", "ap-northeast-1c"]

  public_subnets             = ["10.51.1.0/24", "10.51.2.0/24"]
  private_subnets            = ["10.51.3.0/24", "10.51.4.0/24"]
  nat_gateway_deploy_subnets = ["10.51.1.0/24", "10.51.2.0/24"]

  tags = {
    # 任意のタグ
    Environment        = "runtime"
    RuntimeEnvironment = "production"
    ManagedBy          = "epona"
  }
}

関連するpattern

network patternは、Amazon VPC内に構築される、ほぼすべてのリソースの基盤となります。

関連するpatternは多岐に渡るため、network patternのガイドとしては関連するpatternの紹介は行いません。

その他のpattern自身のガイドから、network patternに依存するかどうかを確認してください。

ログの集約

network patternでは、VPCフローログをAmazon CloudWatch Logs、Amazon S3のいずれかに出力します。

ℹ️ デフォルトではAmazon CloudWatch Logsに出力するように構成されています。

このログは、datadog_log_trigger patternを使用することでDatadogに集約できます。

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
availability_zones パブリックサブネット、プライベートサブネットを配置するAZ list(string) n/a yes
cidr_block VPCに割り当てるCIDRブロック string n/a yes
name 作成するVPC、ネットワークリソースに関する名前 string n/a yes
nat_gateway_deploy_subnets NAT ゲートウェイを配置するサブネットの、CIDRブロックのリスト。パブリックサブネットのCIDRブロックを指定する list(string) n/a yes
private_subnets プライベートサブネットに割り当てる、CIDRブロックのリスト list(string) n/a yes
public_subnets パブリックサブネットに割り当てる、CIDRブロックのリスト list(string) n/a yes
api_gateway_endpoint_enabled API Gateway用のVPCエンドポイントを作成する場合、trueに設定する bool false no
flow_log_cloudwatch_log_group VPCフローログの出力先をCloudWatch Logsにする場合のロググループ名。指定しない場合は、本モジュールで自動的に決定する string null no
flow_log_cloudwatch_log_kms_key_id VPCフローログの出力先をCloudWatch Logsにする場合、CloudWatch Logsを暗号化するためのKMS CMKのARN string null no
flow_log_cloudwatch_log_retention_in_days VPCフローログをCloudWatch Logsに出力する場合の保持期間を設定する。

値は、次の範囲の値から選ぶこと: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653.
Resource: aws_cloudwatch_log_group / retention_in_days
number null no
flow_log_destination_arn VPCフローログの出力先となる、S3またはCloudWatch LogsのARNを指定する。指定しない場合は、本モジュールで自動的に出力先を作成する string null no
flow_log_destination_type VPCフローログの出力先を、s3またはcloud-watch-logsで指定する string "cloud-watch-logs" no
flow_log_enabled VPCフローログを出力する場合、trueに設定する bool true no
flow_log_iam_role_arn VPCフローログに付与するIAMロールのARN string null no
flow_log_s3_bucket VPCフローログの出力先をS3にする場合のバケット名。指定しない場合は、本モジュールで自動的に決定する string null no
flow_log_traffic_type VPCフローログに記録するトラフィックの種類を、ACCEPT、REJECT、ALLのいずれかから指定する string "ALL" no
peering_cidr VPCピアリングする対象VPCのCIDR(peering_idを指定する場合は設定必須) string null no
peering_id VPCピアリングのID string null no
tags 作成するVPC、ネットワークリソースに共通的に付与するタグ map(string) {} no

Outputs

Name Description
flow_log_bucket フローログの出力先となるS3バケット名
flow_log_bucket_id フローログの出力先となるS3バケットID
flow_log_cloudwatch_log_group_name フローログの出力先となるCloudWatch Logsロググループ名
private_link n/a
private_subnets n/a
public_subnets n/a
vpc_id n/a

※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.