【AWS CLI】ALB構築編

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

前回は、ALBおよびNLB関連の情報を取得するコマンドをご紹介いたしましが、 今回は、ALBを構築するするコマンドをご紹介いたします。

https://blog.serverworks.co.jp/aws-cli-elbv2blog.serverworks.co.jp

f:id:swx-fukushima:20201022005339p:plain

実行環境

今回、コマンドを実行した環境は、以下の通りとなります。
(本記事でご紹介しているコマンドの中には、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})

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。