【Powershell】ALBのリスナールールのプライオリティ値を変更しSorryページへ切り替えるps1を作成

# 1. はじめに
ALBのリスナールールの優先順位を変更して、Sorryページを表示させるPowershellスクリプトを作成しました。

Webサイトのメンテナンス時に、ALBで設定した固定ページへ通信を切り替える際、手作業だったり、Lambdaを使うのは少々手間がかかるので、shで一撃で切り替えられたら楽だなと思い、作成に至った次第です。

思いつきで書いたものでコードが若干汚いですが、ご了承下さい・・

# 2. 概要
本記事の概要を以下に記載します。

## 2.1 本記事の概要
AWS ELBのリスナールールのPriority値を変更するPowershellスクリプトを作成しました。

## 2.2 機能要件
- AWS ELBのリスナールールのPriority値を変更する
※複数変更非対応
- Windows環境での実装を想定して、Powershellを使用する

## 2.3 実行環境
- Windows10
- Windows Server 2016,19

## 2.4 事前準備
- AWS CLIがインストール済であること
- ps1ファイルの実行可能権限が付いていること

# 3. Sorryページ切り替えスクリプト
本スクリプトは下記GitHubにも置いてあります。
https://github.com/chibiharu/PowerShell-Tools/tree/master/SwithListenerRulrPriority

## 3.1 使用方法
- 手順1：設定ファイルのパラメータを各項目に従い指定する。

```:setting.conf
#######################################################################################
## 設定ファイル
#######################################################################################
### 実行ログの保管先パスを指定 ###
$OutputPass=""

### 対象ALBのTagNameを指定 ###
$ALBName=""

### リスナーポートを取得 ###
$LISTENERPort=""

### リスナールールの現在のプライオリティ値を指定 ###
$Priority_Before=""

### リスナールールの変更後のプライオリティ値を指定 ###
$Priority_After=""

### AWSクレデンシャル生成 ###
$Env:AWS_ACCESS_KEY_ID=""
$Env:AWS_SECRET_ACCESS_KEY=""
$Env:AWS_DEFAULT_REGION=""
```
- 手順2：メインスクリプトの設定ファイルのパスを指定する

```:Switch_ListenerRule_Priority.ps1
～～～ 略 ～～～
# 設定ファイル(setting.ini)パス
$SettingFile=""
～～～ 略 ～～～
```
- 手順3：メインスクリプトを実行する

```bash
./Switch_ListenerRule_Priority.ps1
```

- 手順4：実行ログを確認し、スクリプトが正常に終了していることを確認する。

```
$ cat ./elb_switch_20220224124101.log
########## $ Start switch_sorry_page_alb_listrner ##########
aws-cli/2.2.5 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
###### info:<ELB名> が存在しているので、後続処理を行います。######
###### info:<ELB名> に以下のリスナーが所属しております。後続処理を行います。######
443	<リスナーARN>
80	<リスナーARN>
###### info:以下のリスナーに対して処理を実行します。後続処理を行います。######
<リスナーARN>
###### info:以下のリスナールールのプライオリティ値を3に変更します。後続処理を行います。######
<リスナールールARN>
###### info:対象リスナーのリスナールール一覧を出力します。後続処理を行います。######
<リスナールールの一覧情報をjson形式で出力>
###### info:全ての処理が正常に終了しました。######
########## $ END switch_ListenerRule_Priority ##########
```

## 3.2 Switch_ListenerRule_Priority.ps1

```powershell:Switch_ListenerRule_Priority.ps1
#######################################################################################
# <説明>
# AWS ELBのリスナールールの優先順位を切り替える
# 
# <更新日>
# 作成日：20220223
# 最終更新日：20220223
#
# <使用時における注意事項>
# ・本スクリプト、及び設定ファイル(setting.ini)の文字コードは「ANSI(SJIS)」を指定すること
# ・-
#
# <コメント>
# ・Sorryページの切り替え等にご使用下さい
# ・-
#
#######################################################################################


#######################################################################################
# 事前設定
#######################################################################################

# 現在の時刻（yyyyMMddhhmmss）を取得
$str_date = Get-Date -Format "yyyyMMddhhmmss"


#######################################################################################
# パラメータ
#######################################################################################

# 設定ファイル(setting.ini)パス
$SettingFile=""

# 設定ファイル読み込み
Get-Content ${SettingFile} | where-object {$_ -notmatch '^\s*$'} | where-object {!($_.TrimStart().StartsWith("#"))}| Invoke-Expression

# 実行ログ
$output = "$OutputPass/elb_switch_${str_date}.log"


#######################################################################################
# メイン処理
#######################################################################################

# ログ見出し出力 
echo "########## $ Start switch_sorry_page_alb_listrner ##########" | Out-File $output -Append

# AWS CLIのバージョンを出力
aws --version | Out-File $output -Append

# TagNameからALBのARNを取得する
$ELBARN=aws elbv2 describe-load-balancers --name ${ALBName} --query 'LoadBalancers[].[LoadBalancerArn]' --output text

# 対象のELBが存在するか確認する
if(${ELBARN} -eq 0 ){
    echo "###### error:${ALBName} が存在しておりません。######" | Out-File $output -Append
}else{
    echo "###### info:${ALBName} が存在しているので、後続処理を行います。######" | Out-File $output -Append
}

# 対象ELBのリスナーARNを取得
$LISTENER_ARN=$(aws elbv2 describe-listeners --load-balancer-arn ${ELBARN} --query "Listeners[][].[Port,ListenerArn]" --output text)

# 対象のELBにリスナーが所属しているか確認する
if(${LISTENER_ARN} -eq 0 ){
    echo "###### error:${ALBName}にリスナーが所属しておりません。######" | Out-File $output -Append
}else{
    echo "###### info:${ALBName} に以下のリスナーが所属しております。後続処理を行います。######" | Out-File $output -Append
}

# 取得したリスナーのARNを分割する
Write-Output $LISTENER_ARN | Out-File $output -Append
$data = Get-Content $output
$Num=Select-String $LISTENERPort $output | ForEach-Object { $($_ -split":")[2]}
$Num=$Num-1
$DefaultListener=$data[$Num]
$DefaultListener=$DefaultListener -replace $LISTENERPort,""
$DefaultListener=$DefaultListener.Trim()
echo "###### info:以下のリスナーに対して処理を実行します。後続処理を行います。######" | Out-File $output -Append
echo $DefaultListener | Out-File $output -Append

# リスナールールのARNを取得
echo "###### info:以下のリスナールールのプライオリティ値を${Priority_After}に変更します。後続処理を行います。######" | Out-File $output -Append
aws elbv2 describe-rules --listener-arn $DefaultListener --query "Rules[?Priority=='${Priority_Before}'][].[RuleArn]" --output text | Out-File $output -Append
$LISTENERRULE_ARN=$(aws elbv2 describe-rules --listener-arn $DefaultListener --query "Rules[?Priority=='${Priority_Before}'][].[RuleArn]" --output text)

# リスナールールのプライオリティ値を変更
aws elbv2 set-rule-priorities  --rule-priorities RuleArn=${LISTENERRULE_ARN},Priority=${Priority_After} | Out-Null

# 対象リスナーの変更後のリスナールールを出力
echo "###### info:対象リスナーのリスナールール一覧を出力します。後続処理を行います。######" | Out-File $output -Append
aws elbv2 describe-rules --listener-arn $DefaultListener --query "Rules[][].[Priority,Actions]" --output text | Out-File $output -Append


#######################################################################################
# 後処理
#######################################################################################

# AWSクレデンシャルを削除
[Environment]::SetEnvironmentVariable("AWS_DEFAULT_REGION", "")
[Environment]::SetEnvironmentVariable("AWS_SECRET_ACCESS_KEY", "")
[Environment]::SetEnvironmentVariable("AWS_ACCESS_KEY_ID", "")

# ログ見出し出力
echo "###### info:全ての処理が正常に終了しました。######" | Out-File $output -Append
echo "########## $ END switch_ListenerRule_Priority ##########" | Out-File $output -Append
```

# 4. まとめ
シェルスクリプトで実装する方が簡単で利用者も多いかなとは思ったのですが、自分が以前いた現場ではPowershellバリバリといった感じでググっても情報が無くこういうツール作るのに非常に苦労したので、そういう方の助けになればと思います。

### [参照]
- [ALBのSorryページ切り替えシェルを作成してみました(CLI)](https://cloud5.jp/alb-sorry-page-switch/)
- [awscliを使ったALBによるメンテナンス画面表示](https://note.com/udemaex/n/nb012758fd1f8)