Skip to content

ORCA Proxy Forward Proxy 設計

目的

ORCA(日医標準レセプトソフト)との連携に使用する Forward Proxy 基盤のインフラ設計を定義する。 Apache HTTP Server による Forward Proxy を NLB + EC2 構成で提供し、TLS 終端と Basic 認証によるアクセス制御を実現する。

ゴール

  • staging / production の2環境(別AWSアカウント)に Forward Proxy を構築する
  • fastdoctor-template の標準的なサービス構成として管理し、再利用可能なテンプレートモジュールとして実装する
  • TLS 終端、Basic 認証、Private Subnet 配置による多層的なセキュリティを確保する

構成図

コンポーネント構成

Client → NLB (TLS :1130) → EC2 (Apache :3128) → ORCA

         ACM 証明書で TLS 終端
         Basic 認証でアクセス制御

要件

  • NLB で TLS を終端し、ACM 証明書を使用する
  • Forward Proxy への接続は Basic 認証で制御する
  • EC2 は Private Subnet に配置し、直接のインターネットアクセスを遮断する
  • NLB は外部公開(Public Subnet 配置)とし、アクセス制限は設けない
  • IMDSv2 を強制し、メタデータサービスのセキュリティを確保する
  • SSM(Systems Manager)経由で EC2 を管理する(SSH キーペア不要)
  • EC2 Instance Connect Endpoint による接続をオプションで提供する

設計

Terraform ディレクトリ構成

再利用可能なテンプレートモジュールと環境別ディレクトリに分離する。

fastdoctor-template/
├── template_modules/
│   └── orca-proxy/                 # 再利用可能モジュール
│       ├── main.tf                 # SG, IAM, EC2, NLB
│       ├── variables.tf
│       ├── outputs.tf
│       └── templates/
│           └── user_data.sh.tftpl  # Apache 初期化スクリプト

└── orca-proxy/
    ├── staging/                    # ステージング環境
    └── production/                 # 本番環境

NLB(Network Load Balancer)

設定項目
タイプNetwork Load Balancer
スキームinternet-facing(外部公開)
配置先Public Subnet(東京 a, c)
リスナーTLS :1130
TLS ポリシーELBSecurityPolicy-TLS13-1-2-2021-06
証明書ACM 証明書
ターゲットグループTCP :3128(EC2)
ヘルスチェックHTTP :80 /status
クロスゾーン負荷分散有効

EC2 インスタンス

設定項目
AMIUbuntu(arm64)
インスタンスタイプt4g.small
配置先Private Subnet(東京 a)
ルートボリュームgp3, 8GB, 暗号化有効, 3000 IOPS
メタデータIMDSv2 強制(http_tokens = required)
IAM ロールAmazonSSMManagedInstanceCore + CloudWatchAgentServerPolicy
ユーザーデータApache Forward Proxy + Basic 認証 + CloudWatch Agent セットアップ

セキュリティグループ

EC2 用 SG

方向ソース/宛先ポート説明
IngressVPC CIDR3128 (TCP)NLB → Proxy
IngressVPC CIDR80 (TCP)NLB → ヘルスチェック
IngressEC2 Instance Connect prefix list22 (TCP)EC2 Instance Connect(オプション)
Egress0.0.0.0/0Allアウトバウンド全許可

NLB 用 SG

方向ソース/宛先ポート説明
Ingress0.0.0.0/01130 (TCP)TLS リスナーへのアクセス
Egress0.0.0.0/0Allアウトバウンド全許可

Apache Forward Proxy 設定

ユーザーデータスクリプトで以下を自動設定する:

  • Apache2 + モジュール(proxy, proxy_connect, rewrite)
  • Forward Proxy: ProxyRequests On, AllowCONNECT 443
  • Basic 認証: htpasswd ファイルによるユーザー認証
  • ヘルスチェック用 VirtualHost: ポート 80 の /status エンドポイントで 200 OK を返す

ログ転送(CloudWatch Logs)

Apache Proxy のログを CloudWatch Logs へ転送する。CloudWatch Agent を EC2 にインストールし、ログファイルを監視・転送する。

NLB ログではなく Apache ログを転送する理由

  • Proxy 認証失敗の可視化: NLB のアクセスログでは Basic 認証の成功/失敗を判別できない。Apache の proxy.log には認証結果を含む詳細なリクエスト情報が記録される
  • NLB ログの有用性が低い: NLB は 0.0.0.0/0 で全アクセスを許可しており、NLB 側のログは Proxy 運用上の有用な情報を提供しない

転送対象ログ

ログファイルCloudWatch ロググループ内容
/var/log/apache2/proxy.log/orca-proxy/{env}/apache/proxyForward Proxy アクセスログ(認証情報含む)
/var/log/apache2/error.log/orca-proxy/{env}/apache/errorApache エラーログ

CloudWatch Agent 設定

  • ユーザーデータスクリプトで CloudWatch Agent をインストール・設定
  • SSM Parameter Store に設定 JSON を保存し、Agent が参照する構成も将来的に検討可能
  • ログ保持期間: 90日(デフォルト、将来の要件に応じて調整)

Terraform リソース

リソース説明
aws_cloudwatch_log_groupロググループ(proxy, error 用に各1つ)
aws_iam_role_policy_attachmentCloudWatchAgentServerPolicy のアタッチ

ネットワーク(VPC / Subnet)

VPC / Subnet は common.tfstate(common remote state)から取得する。

hcl
locals {
  networks_tokyo = {
    vpc_id               = data.terraform_remote_state.not_immutable.outputs.vpc_id_tokyo
    vpc_subnet-public-a  = data.terraform_remote_state.not_immutable.outputs.vpc_subnet-public-a_tokyo
    vpc_subnet-public-c  = data.terraform_remote_state.not_immutable.outputs.vpc_subnet-public-c_tokyo
    vpc_subnet-private-a = data.terraform_remote_state.not_immutable.outputs.vpc_subnet-private-a_tokyo
    vpc_subnet-private-c = data.terraform_remote_state.not_immutable.outputs.vpc_subnet-private-c_tokyo
  }
}

環境別差分

項目stagingproduction
AWS アカウントstaging 用production 用(別アカウント)
リソース名プレフィックスorca-proxy-stgorca-proxy-prod
State Bucketfd-tfstate-stagingfd-tfstate-prd
TFVars S3fd-staging-tfvars-filesfd-production-tfvars-files
AMI ID環境毎に指定環境毎に指定
ACM 証明書環境毎に指定環境毎に指定

コスト

月額コスト試算(1環境あたり)

リソース台数/設定単価月額コスト
EC2 (t4g.small)1台$0.0168/時間~$12.26
NLB1台$22.50 + LCU~$25.00
EBS (gp3, 8GB)1ボリューム$0.096/GB/月~$0.77
CloudWatch Logs(取り込み)~1GB/月想定$0.76/GB~$0.76
CloudWatch Logs(保管)~3GB(90日分)$0.033/GB/月~$0.10
合計~$38.89

注記:

  • 東京リージョン(ap-northeast-1)での試算
  • データ転送量は含まない
  • CloudWatch Logs の取り込み量はトラフィック量に依存(1GB/月は目安)

検討必要なもの

  • 各環境の AMI ID の確定
  • 各環境の ACM 証明書 ARN の確定
  • Basic 認証のユーザー名 / パスワードの確定
  • EC2 Instance Connect Endpoint の要否
  • 冗長化の検討(現在 EC2 は1台構成)
  • 監視・アラートの設定(Datadog 等)

最終更新日: 2026-02-22 作成者: SRE