リダイレクト専用ALBの新規作成

EC2などのリソースがアタッチされていないリダイレクト専用のALB(Application Load Balancer)を作成する機会がありましたので、備忘録を残したいと思います。

ALBはパスベースルーティングなどのL7階層機能がCLBと比べて強化されています。今回はリクエスト中のホストヘッダ値を評価して、指定したURLへリダイレクトのみを行うALBを作成します。

1、前提条件


作業端末にAWSCLIバージョン「1.16.260」以上がインストールされ、AWSを操作するための権限がある事をを確認します。

2、各種パラメータの設定


ALBを作成する前に、作成に必要なパラメータ(変数)を設定します。

2-1、VPC・サブネット情報の設定

ALBにアタッチするVPC・サブネットを設定します。設定するサブネットはパブリックサブネットを設定します。また、別AZ(アベイラビリティーゾーン)をそれぞれ1つずつ設定します。

VPC_ID="vpc-XXXXXXXXXXXXXXXXX"
SUBNET_ID1="subnet-XXXXXXXXXXXXXXXXX"
SUBNET_ID2="subnet-XXXXXXXXXXXXXXXXX"

2-2、ALB・SGの設定名

<ELB_NAME> ALBの設定文字数は、32文字まで設定できます。

<SG_NAME> SGの設定文字は数は255文字までで、設定名の先頭に「sg-」を付けることはできません。「a-z、A-Z、0-9、スペース、._-:/()#,@[]+=&;{}!」の文字を使って名前を設定できます。

ELB_NAME="hogehoge-alb"
SG_NAME="hogehoge-sg"

2-3、リスナー・リダイレクトルール設定

リスナー及び・リダイレクトのパラメータを設定します。

<CERTIFICATES> ACMなどに登録された証明書のARNを設定します。設定する証明書はリダイレクト元のCNが設定されている証明書を選択します。(サンプルを例にすればCNが[*.hogehoge.com]のようになっている証明書を選択します。)

<HOST_HEADER_VALUE> リダイレクト元のURLを設定します。複数のURLを同じURLにリダイレクトさせる場合は、サンプルのようにカンマで区切ります。

<ACTIONS> リダイレクト先URLを設定します。(Host)部分にリダイレクト先のURLを設定します。この部分の詳細については、以下のリンクを参照して下さい。

Rule condition types

CERTIFICATES="arn:aws:acm:<リージョンID>:<AWSアカウント番号>:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
HOST_HEADER_VALUE="test1.hogehoge.com, test2.hogehoge.com, test3.hogehoge.com"
ACTIONS="Type=redirect,RedirectConfig={"Protocol=HTTPS,Port=443,Host=www.fugafuga.net,Path=/fuga/,StatusCode=HTTP_301"}"

3、SGの作成・設定


3-1、SGの作成

以下のコマンドを実行して、SGを作成します。

※各コマンド実行時に出力されるIDなどを変数に格納し、別のコマンドで利用しています。そのため、セッションタイムアウトなどでターミナルが終了しないように注意してください。

aws ec2 create-security-group --group-name ${SG_NAME} --description ${SG_NAME} --vpc-id ${VPC_ID}
SG_ID=`aws ec2 describe-security-groups --filter Name=group-name,Values=${SG_NAME} \
 --query 'SecurityGroups[].GroupId' --output text` && echo ${SG_ID}

3-2、SGへの許可ルール設定

「3-1」で作成したSGへアクセス許可ルールを設定します。サンプルでは一般的なWebページのリダイレクトを想定しているので、ポート80番と443番を設定します。

aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 443 --cidr 0.0.0.0/0

4、ALBの作成・設定


4-1、ALBの作成

以下のコマンドを実行して、ALBを作成します。

このコマンドを実行すると、リスナーが設定されていないALBが作成されます。

ELB_ARN=`aws elbv2 create-load-balancer --name ${ELB_NAME} \
 --subnets ${SUBNET_ID1} ${SUBNET_ID2} --security-groups ${SG_ID} \
 --query LoadBalancers[].LoadBalancerArn --output text `
DNSName=`aws elbv2 describe-load-balancers --load-balancer-arns ${ELB_ARN} \
 --query LoadBalancers[].DNSName --output text `
aws elbv2 describe-load-balancers --load-balancer-arns ${ELB_ARN}

4-2、HTTP用リスナーの作成

以下のコマンドを実行して、HTTP(80番ポート用)リスナーを作成します。

ここでは、どのルールにも該当しなかったリクエストに対するデフォルトアクションを設定します。今回はリダイレクト専用のため、デフォルトアクションに「2-3」で設定したリダイレクトルールを設定します。

ELB_LISTENER_80=`aws elbv2 create-listener --load-balancer-arn ${ELB_ARN} --protocol HTTP --port 80 \
 --default-actions ${ACTIONS} \
 --query Listeners[].ListenerArn --output text `
aws elbv2 describe-listeners --listener-arns ${ELB_LISTENER_80}

4-3、HTTP用リダイレクトルール作成

以下のコマンドを実行して、HTTP用のリダイレクトルールを作成します。

ルールに該当した場合のアクションが、リスナーのデフォルトアクションと同じなため、正直言って作成する必要はないのですが、リダイレクトするURLを明示的に示すために設定します。

リスナーのデフォルトアクションとは違ったリダイレクト先を指定したい場合は、<actions>部分にリダイレクト設定を記述します。記載方法は、「2-3」の<ACTIONS>に記載した書式になります。

aws elbv2 create-rule --listener-arn ${ELB_LISTENER_80} --priority 100 \
 --conditions Field=host-header,Values="${HOST_HEADER_VALUE}" \
 --actions ${ACTIONS}

4-4、HTTPS用リスナーの作成

以下のコマンドを実行して、HTTPS用リスナーを作成します。

HTTPリスナーと比べて、証明書設定の項目が追加されます。

ELB_LISTENER_443=`aws elbv2 create-listener --load-balancer-arn ${ELB_ARN} --protocol HTTPS --port 443 \
 --ssl-policy ELBSecurityPolicy-2016-08 \
 --certificates CertificateArn=${CERTIFICATES} \
 --default-actions ${ACTIONS} \
 --query Listeners[].ListenerArn --output text `
aws elbv2 describe-listeners --listener-arns ${ELB_LISTENER_443}

4-5、HTTPS用リダイレクトルール作成

以下のコマンドを実行して、HTTPS用のリダイレクトルールを作成します。

aws elbv2 create-rule --listener-arn ${ELB_LISTENER_443} --priority 100 \
 --conditions Field=host-header,Values="${HOST_HEADER_VALUE}" \
 --actions ${ACTIONS}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)