こんにちは。AWS CLIが好きな福島です。
前回は、ALBおよびNLB関連の情報を取得するコマンドをご紹介いたしましが、 今回は、ALBを構築するするコマンドをご紹介いたします。
https://blog.serverworks.co.jp/aws-cli-elbv2blog.serverworks.co.jp

実行環境
今回、コマンドを実行した環境は、以下の通りとなります。
(本記事でご紹介しているコマンドの中には、Linuxのコマンドを利用している箇所があります。)
# uname -a Linux LAPTOP-CNM26HN6 4.4.0-18362-Microsoft #1049-Microsoft Thu Aug 14 12:01:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux #
流れ
流れは以下の通りです。
①ターゲットグループの作成
②①へターゲットの登録
③ELBの作成
④リスナー設定
構築
⓪事前準備
## ターゲットグループ名 TARGET_GROUP_NAME=fk-test-target-cli ## ターゲットグループのプロトコル TARGET_GROUP_PROTCOL=HTTP ## ターゲットグループのポート TARGET_GROUP_PORT=80 ## ヘルスチェックパス HTALTH_CHECK_PATH=/healthcheck.html ## ヘルスチェックポート HTALTH_CHECK_PORT=80 ## ヘルスチェックプロトコル HTALTH_CHECK_PROTCOL=HTTP ## ヘルスチェックの間隔(秒) HTALTH_CHECK_INTERVAL=30 ## ヘルスチェックのタイムアウト値(秒) HTALTH_CHECK_TIMEOUT=5 ## 正常と判断する閾値 HTALTHY_THRESHOLD_COUNT=5 ## 異常と判断する閾値 UNHTALTHY_THRESHOLD_COUNT=2 ## ターゲットのタイプ(lambdaも指定できるが今回は割愛) TARGET_TYPE=ip or instance ## VPCのID VPCID=vpc-0fee138d3e0deef81 ## ターゲットのIP(ターゲットタイプがipの場合のみ指定) TARGET_IP=10.88.0.59 ## ターゲットのインスタンスID(ターゲットタイプがinsntaceの場合のみ指定) TARGET_ID=i-0808672558492fde8 ## ターゲットのポート TARGET_PORT=80 ## ELBの名前 ELB_NAME=fk-test-elb-cli ## ELBを作成するサブネットID SUBETIDS=subnet-0093d7475de79313b subnet-03fbedc39e6211234 ## ELBにアタッチするSGID SGIDS=sg-00c78fbf089ace674 sg-02df472801a58f25e ## ELBのスキーマ SCHEME=internet-facing or internal ## ELBのタイプ ELB_TYPE=application or network ## IPアドレスタイプ IP_ADDRESS_TYPE=ipv4 ## リスナーのプロトコル(HTTPの場合) LISTENER_PROTCOL_HTTP=HTTP ## リスナーのプロトコル(HTTPの場合) LISTENER_PORT_HTTP=80 ## リスナーのプロトコル(HTTPSの場合) LISTENER_PROTCOL_HTTPS=HTTPS ## リスナーのポート(HTTPSの場合) LISTENER_PORT_HTTPS=443 ## セキュリティポリシー(HTTPSの場合指定) ※1 SSL_POLICY=ELBSecurityPolicy-TLS-1-2-Ext-2018-06 ## ACMに登録した証明書のARN CERTIFICATE_ARN=arn:aws:acm:ap-northeast-1:xxxxxxxxxxxxxx:certificate/68814875-7a52-44db-a1e0-7042ace91ba6
※1 設定できる値の詳細は以下を参照。
Application Load Balancer の HTTPS リスナーを作成する - Elastic Load Balancing
①ターゲットグループの作成
作業前の状態確認
ターゲットグループが存在しない場合、エラーが返ってきます。
aws elbv2 describe-target-groups --names ${TARGET_GROUP_NAME}
ターゲットグループの作成
aws elbv2 create-target-group \
--name ${TARGET_GROUP_NAME} \
--protocol ${TARGET_GROUP_PROTCOL} \
--port ${TARGET_GROUP_PORT} \
--health-check-path ${HTALTH_CHECK_PATH} \
--health-check-protocol ${HTALTH_CHECK_PROTCOL} \
--health-check-port ${HTALTH_CHECK_PORT} \
--health-check-interval-seconds ${HTALTH_CHECK_INTERVAL} \
--health-check-timeout-seconds ${HTALTH_CHECK_TIMEOUT} \
--healthy-threshold-count ${HTALTHY_THRESHOLD_COUNT} \
--unhealthy-threshold-count ${UNHTALTHY_THRESHOLD_COUNT} \
--target-type ${TARGET_TYPE} \
--vpc-id ${VPCID}
作業後の状態確認
aws elbv2 describe-target-groups --names ${TARGET_GROUP_NAME}
②ターゲットの登録
作業前の状態確認
aws elbv2 describe-target-health \
--target-group-arn $(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" --output text --name ${TARGET_GROUP_NAME}) \
--query 'TargetHealthDescriptions[].Target' --output table
ターゲットの登録(ターゲットグループのタイプがipの場合)
aws elbv2 register-targets \
--targets AvailabilityZone=all,Id=${TARGET_IP},Port=${TARGET_PORT} \
--target-group-arn $(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" --output text --name ${TARGET_GROUP_NAME})
ターゲットの登録(ターゲットグループのタイプがinstanceの場合)
aws elbv2 register-targets \
--targets Id=${TARGET_ID},Port=${TARGET_PORT} \
--target-group-arn $(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" --output text --name ${TARGET_GROUP_NAME})
作業後の状態確認
aws elbv2 describe-target-health \
--target-group-arn $(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" --output text --name ${TARGET_GROUP_NAME}) \
--query 'TargetHealthDescriptions[].Target' --output table
③ELB構築
ELBが存在しない場合、エラーが返ってきます。
作業前の状態確認
aws elbv2 describe-load-balancers --names ${ELB_NAME}
ELBの作成
aws elbv2 create-load-balancer \
--name ${ELB_NAME} \
--subnets ${SUBETIDS} \
--security-groups ${SGIDS} \
--scheme ${SCHEME} \
--type ${ELB_TYPE} \
--ip-address-type ${IP_ADDRESS_TYPE} \
--tags Key=Name,Value=${ELB_NAME}
作業後の状態確認
aws elbv2 describe-load-balancers --names ${ELB_NAME}
④リスナー設定
作業前の状態確認
aws elbv2 describe-listeners \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME})
リスナーの設定(HTTPの場合)
aws elbv2 create-listener \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME}) \
--protocol ${LISTENER_PROTCOL_HTTP} \
--port ${LISTENER_PORT_HTTP} \
--default-actions Type=forward,TargetGroupArn=$(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" \
--output text \
--name ${TARGET_GROUP_NAME})
リスナーの設定(HTTPSの場合)
aws elbv2 create-listener \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME}) \
--protocol ${LISTENER_PROTCOL_HTTPS} \
--port ${LISTENER_PORT_HTTPS} \
--default-actions Type=forward,TargetGroupArn=$(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" --output text --name ${TARGET_GROUP_NAME}) \
--ssl-policy ${SSL_POLICY} \
--certificates CertificateArn=${CERTIFICATE_ARN}
作業後の状態確認
aws elbv2 describe-listeners \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME})
おまけ
S3のアクセスログ設定
S3_BUCKET=awslogs-elb-xxxxxxxxxxxxxx
S3_PREFIX=${ELB_NAME}
作業前の状態確認
aws elbv2 describe-load-balancer-attributes \
--output text \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" \
--output text \
--names ${ELB_NAME}) | grep access_logs
アクセスログの設定
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME})
--attributes Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=${S3_BUCKET} \
Key=access_logs.s3.prefix,Value=${S3_PREFIX} \
作業後の状態確認
aws elbv2 describe-load-balancer-attributes \
--output text \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" \
--output text \
--names ${ELB_NAME}) | grep access_logs
テストファイルの確認
ACCOUNTID=$(aws sts get-caller-identity --query "Account" --output text)
aws s3 ls ${S3_BUCKET}/${S3_PREFIX}/AWSLogs/${ACCOUNTID}/
ELBの削除
aws elbv2 delete-load-balancer \
--load-balancer-arn $(aws elbv2 describe-load-balancers --query "LoadBalancers[].LoadBalancerArn" --output text --names ${ELB_NAME})
ターゲットグループの削除
aws elbv2 delete-target-group \
--target-group-arn $(aws elbv2 describe-target-groups --query "TargetGroups[].TargetGroupArn" \--output text --name ${TARGET_GROUP_NAME})