のぴぴのメモ

自分用のLinuxとかの技術メモ

フォワードプロキシ(NLB+EC2(AutoScaling))を作成するCloudFormation

概要

NLB + EC2(Squid)構成のフォワードプロキシを作成するCloudFormationのテンプレートです。
ソースコードこちらのGitHubにあります。

f:id:nopipi:20220212224430p:plain:w600

  • クライアントはNLBに対してTCPの3128ポートにプロキシ接続してアクセスして利用します。
  • プロキシはSquidを利用
  • SquidのログはLogsに出力(CloudWatchエージェントを利用)

利用方法

前提条件

  • パブリックサブネットを有するVPCがあること
  • CloudFormationのデプロイ用にAdministratorAccess権限のある実行環境があること(CLIまたはマネージメントコンソール)
  • CLIを利用する場合はAWS CLIがセットアップされ、上記のAdministratorAccessで実行可能なプロファイルが設定済みであること
  • gitコマンドが利用可能なこと

(オプション)AWS CLIのための準備

手順でAWS CLIを利用する場合は事前に以下の設定を行う

export PROFILE="default"       #Specify a profile with AdministratorAccess privileges
export REGION="ap-northeast-1" #Specify Region

#動作テスト
aws --profile ${PROFILE} --region ${REGION} sts get-caller-identity

#以下のようにUserID/Account/Arnが表示されればOK
{
    "UserId": "AROAZKIQKBDEIBOE2MGEJ:botocore-session-xxxxxxxxxx",
    "Account": "999999999999",
    "Arn": "arn:aws:sts::999999999999:assumed-role/OrganizationAccountAccessRole/botocore-session-xxxxxxxxxx"
}

コードのダウンロード

git clone https://github.com/Noppy/CFn_ForwardProxy.git
cd CFn_ForwardProxy

設定情報の取得

CloudFormationのスタック作成時のパラメーターに設定する以下の情報を事前に控えておく

  • VPC構成情報
    • VPC ID
    • フォワードプロキシのEC2インスタンスを配置するパブリックサブネットのID(マルチAZ構成の場合は複数確認)
    • NLBを配置するプライベートまたはパブリックサブネットのID(マルチAZ構成の場合は複数確認)
  • Amazon Linux2(x86_64)のAMI ID
AMZ2_AMIID=$(aws --profile ${PROFILE} --region ${REGION} --output text \
    ec2 describe-images \
        --owners amazon \
        --filters 'Name=name,Values=amzn2-ami-kernel-5.10-hvm-2.0.????????.?-x86_64-gp2' \
                      'Name=state,Values=available' \
    --query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' ) ;
echo "AMZ2_AMIID = ${AMZ2_AMIID}"

CloudFormationによるデプロイ

  • マネージメントコンソールの場合:
    • 具体的な操作手順は、CloudFormationのユーザーガイドを参照下さい。
    • テンプレートは、./src/forward_proxy.yaml
    • パラメータ: 上記の「設定情報の取得」で確認した情報を設定します。
  • CUIの場合:
# 「設定情報の取得」で確認した情報を設定
VPCID="<VPC ID>" 
PubSubIds="<PubSub1Id>,<PubSub2Id>,<Pubsub3Id>"
ElbSubIds="<ElbSub1Id>,<Elbsub2Id>,<ElbSub3Id>"
SrcCidr="<CIDR of VPC>"

# パラメータ用のJSON生成
CFN_STACK_PARAMETERS='
[
    {
        "ParameterKey": "VpcId",
        "ParameterValue": "'"${VPCID}"'"
    },
    {
        "ParameterKey": "PublicSubnets",
        "ParameterValue": "'"${PubSubIds}"'"
    },
    {
        "ParameterKey": "ElbSubnets",
        "ParameterValue": "'"${ElbSubIds}"'"
    },
    {
        "ParameterKey": "ProxyAmiId",
        "ParameterValue": "'"${AMZ2_AMIID}"'"
    },
    {
        "ParameterKey": "AllowCidrBlockForProxy",
        "ParameterValue": "'"${SrcCidr}"'"
    }
]'

# スタックの作成
aws --profile ${PROFILE} --region ${REGION} \
    cloudformation create-stack \
        --stack-name "ForwardProxy" \
        --template-body "file://./src/forward_proxy.yaml" \
--parameters "${CFN_STACK_PARAMETERS}" \
--capabilities CAPABILITY_IAM ;

NLBのDNS取得

  • マネージメントコンソールの場合:
    • 作成したスタックのOutputsで確認する
  • CUIの場合:
ProxyDns=$(aws --profile ${PROFILE} --region ${REGION} --output text \
    cloudformation describe-stacks \
        --stack-name "ForwardProxy" \
        --query 'Stacks[].Outputs[?OutputKey==`LoadBalancerDns`].[OutputValue]')
echo "ProxyDns = ${ProxyDns}"

テスト

Linuxサーバをクライアントとしてテストする場合の手順をいかに示します。

ProxyDns="<「NLBのDNS取得」で取得したDNS情報>"
export http_proxy="http://${ProxyDns}:3128"
export https_proxy="http://${ProxyDns}:3128"

# Test
# "https://www.google.co.jp" is allowed, "https://www.yahoo.co.jp" is denied.
curl https://www.google.co.jp
curl https://www.yahoo.co.jp