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 インスタンス
| 設定項目 | 値 |
|---|---|
| AMI | Ubuntu(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
| 方向 | ソース/宛先 | ポート | 説明 |
|---|---|---|---|
| Ingress | VPC CIDR | 3128 (TCP) | NLB → Proxy |
| Ingress | VPC CIDR | 80 (TCP) | NLB → ヘルスチェック |
| Ingress | EC2 Instance Connect prefix list | 22 (TCP) | EC2 Instance Connect(オプション) |
| Egress | 0.0.0.0/0 | All | アウトバウンド全許可 |
NLB 用 SG
| 方向 | ソース/宛先 | ポート | 説明 |
|---|---|---|---|
| Ingress | 0.0.0.0/0 | 1130 (TCP) | TLS リスナーへのアクセス |
| Egress | 0.0.0.0/0 | All | アウトバウンド全許可 |
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/proxy | Forward Proxy アクセスログ(認証情報含む) |
/var/log/apache2/error.log | /orca-proxy/{env}/apache/error | Apache エラーログ |
CloudWatch Agent 設定
- ユーザーデータスクリプトで CloudWatch Agent をインストール・設定
- SSM Parameter Store に設定 JSON を保存し、Agent が参照する構成も将来的に検討可能
- ログ保持期間: 90日(デフォルト、将来の要件に応じて調整)
Terraform リソース
| リソース | 説明 |
|---|---|
aws_cloudwatch_log_group | ロググループ(proxy, error 用に各1つ) |
aws_iam_role_policy_attachment | CloudWatchAgentServerPolicy のアタッチ |
ネットワーク(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
}
}環境別差分
| 項目 | staging | production |
|---|---|---|
| AWS アカウント | staging 用 | production 用(別アカウント) |
| リソース名プレフィックス | orca-proxy-stg | orca-proxy-prod |
| State Bucket | fd-tfstate-staging | fd-tfstate-prd |
| TFVars S3 | fd-staging-tfvars-files | fd-production-tfvars-files |
| AMI ID | 環境毎に指定 | 環境毎に指定 |
| ACM 証明書 | 環境毎に指定 | 環境毎に指定 |
コスト
月額コスト試算(1環境あたり)
| リソース | 台数/設定 | 単価 | 月額コスト |
|---|---|---|---|
| EC2 (t4g.small) | 1台 | $0.0168/時間 | ~$12.26 |
| NLB | 1台 | $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