説明

WINDOWS on EC2に紐づけられているELBからEC2を付け外す、もしくは付け戻すスクリプトをpowershellで書きました。
スクリプトのパラメータ指定で付け外し か 付け戻しを指定出来ます。

実現したい事

自動で定期リブートされるWINサーバで、stop時に全てのELBから自動で付け外したい。
上記に加えて、開始時に元のELBに自動で付け戻したい。

ソースコード

regELB.ps1

param
(
    [switch]$detach,
    [switch]$attach
)

$savelbfile='C:Userselbnamefile';
$logfile='C:UsersregELB.log'
$awsparam=@{
    Region = "ap-northeast-1"
    AccessKey = "AKIXXXXXXXXXXXXXXXXX"
    SecretKey = "YYYYYYYYYYYYYYYYYYYYYY"
}

try
{
    $startdate=Get-Date;
    Write-Output "-----------------" >>$logfile;
    Write-Output "Start[$startdate]" >>$logfile;
    #parameter check
    if(!($detach -xor $attach))
    {
        Write-Output "Parameter error. Parameter should be used with -detach or -attach exclusively" >>$logfile;
        exit 1;
    }

    import-module "C:Program Files (x86)AWS ToolsPowerShellAWSPowerShellAWSPowerShell.psd1"
    Initialize-AWSDefaults @awsparam >>$logfile;

    $InstanceId = (Invoke-WebRequest '169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing).Content;
    $elbInstanceObj = New-Object Amazon.ElasticLoadBalancing.Model.Instance;
    $elbInstanceObj.InstanceId = $InstanceId;

    if($detach -eq $true)
    {
        Write-Output "detach route" >>$logfile

        echo $null > $savelbfile;

        $ELBs=Get-ELBLoadBalancer;

        foreach($ELB in $ELBs)
        {
            foreach($elbinstance in $ELB.Instances)
            {
                if($elbinstance.InstanceId -eq $InstanceId)
                {
                    #save attached ELB name for register route
                    Add-Content $savelbfile $ELB.LoadBalancerName;
                    Remove-ELBInstanceFromLoadBalancer -LoadBalancerName $ELB.LoadBalancerName -Instances $elbInstanceObj -Force;
                }
            }
        }
    }
    else
    {# ($attach -eq $true)
        Write-Output "attach route" >>$logfile

        If(Test-Path -path $savelbfile)
        {
            $lines = @(Get-Content $savelbfile)
        }
        else
        {
            Write-Output "$savelbfile is not found" >>$logfile;
                exit 1;
        }
        foreach ($elbname in $lines)
        {
            Register-ELBInstanceWithLoadBalancer -LoadBalancerName $elbname -Instances $elbInstanceObj > $null;
        }
    }
    $enddate=Get-Date
    Write-Output "Normal END[$enddate]" >>$logfile

    exit 0;
}
catch
{
    Write-Output $_ >>$logfile;
    $_="";
    $enddate=Get-Date;
    Write-Output "Abnormal END[$enddate]" >>$logfile;
    exit 1;
}

注意事項

WINDOWSのシャットダウンもしくはリブート時に実行させる為にWINDOWSのグループポリシー機能を利用する場合はIAM Roleが効かないようでした。
グループポリシーにスクリプト登録して使う場合は、上述のソースコードのように、アクセスキー・シークレットキーを直書きする必要があるようです(ハマりました・・・)。

■実行例(対象のWINサーバで手打ち実行)

・付け外し時

PS C:Users>  C:UsersregELB.ps1 -detach

・付け戻し時

PS C:Users>  C:UsersregELB.ps1 -attach

注:付け戻しは付け外しを行なった後にのみ有効です。

元記事はこちら

WINサーバを紐づいているELBから外して付け戻すスクリプト(powershell製)