簡體   English   中英

如何自動將彈性IP地址與AutoScale組中的Windows服務器關聯?

[英]How do I associate an Elastic IP Address to a Windows Server in an AutoScale Group Automatically?

我試圖找到一種方法的示例,將相同的彈性IP地址可靠地關聯到屬於AutoScale組的Windows Server。 本質上,目標是處理服務器終止並通過AutoScale替換並保持相同的公共IP(遠程提供的服務所需)的情況。

AutoScale組配置為僅允許最多1台服務器和最少1台服務器用於自動恢復方案。 服務器位於VPC中,本質上是需要靜態尋址的遠程Web隊列的工作者。

我還想利用IAM角色,這樣我就不必在提供UserData的腳本中嵌入AWS憑據。 目前我正在尋找一個示例PowerShell腳本,但如果有人知道更好的方法,我當然願意接受建議。 我已經看到了一些較舊的例子,但它們已經過時並使用了我想避免使用的嵌入式AWS憑證。

這是我們使用的:

在Autoscaling組的啟動配置中,指定以下用戶數據:

<script>
PowerShell -ExecutionPolicy Bypass -NoProfile -File c:\tools\server_userdata.ps1 -instanceEIP eipalloc-abcdefg
</script>

這將EIP標識符eipalloc-abcdefg傳遞給腳本。 當然,將其更改為您的EIP。

我們在實例上預先加載userdata腳本,而不是將完整腳本傳遞給用戶數據。 我們通常在這個腳本中做很多配置; 我已經將它簡化為僅在此處進行EIP分配。 使用預烘焙腳本,我們可以在各種實例函數和環境中共享相同的腳本,並通過僅通過用戶數據傳遞參數來控制該實例的配置,在腳本中沒有任何靜態編碼。

另請注意,我們使用腳本文件和Windows事件日志條目來簡化故障排除。

C:\\工具\\ server_userdata.ps1

<powershell>
Import-Module WebAdministration
Start-Transcript -Path C:\userscriptlog.txt
param (
    [string]$instanceEIP = $(throw "-instanceEIP is required."),
)
if ([System.Diagnostics.EventLog]::SourceExists("Userdata") -eq $False) {
    New-Eventlog -Logname Application -Source 'Userdata' 
}
Write-Eventlog -Logname Application -Source 'Userdata' -EventId 1 -EntryType Information -Message 'Begining post-deployment configuration script'

# get instance-id
try { 
    $InstanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id).content
} catch { 
    $_.Exception.message | out-file c:\InstanceId_error.log 
    Write-Host "FATAL: InstanceId exception"
    Exit 1
}

if (!$InstanceId) { 
    Write-Host "FATAL: InstanceId is null"
    Exit    
} else {
    $InstanceId | out-file C:\InstanceId.txt
    Write-Host "InstanceId: $InstanceId"    
}

Write-Host "EIP: $instanceEIP"

# assign EIP

$request = New-Object -TypeName Amazon.EC2.Model.AssociateAddressRequest
[void]$request.WithInstanceId($InstanceId)
[void]$request.WithPublicIp($instanceEIP)

$result = $client.AssociateAddress($request)
if ($result) {
  Write-Host  "Address $instanceEIP assigned to $instanceID successfully."
  exit 0
}
else {
  Write-Host  "Failed to assign $instanceEIP to $instanceID."
  exit 2
}

Write-Eventlog -Logname Application -Source 'Userdata' -EventId 1 -EntryType Information -Message 'Post-deployment configuration script complete'
Stop-Transcript
</powershell>

關於IAM角色,此腳本假定實例具有適當的角色和權限。 以下是必需的權限:

{  
   "Version":"2012-10-17",
   "Statement":[  
      {  
         "Action":[  
            "ec2:AssociateAddress",
            "ec2:DescribeAddresses",
         ],
         "Sid":"Stmt1375723773000",
         "Resource":[  
            "*"
         ],
         "Effect":"Allow"
      }
   ]
}

如果它有幫助我需要Auto Scaling Group來維護單個IP后面的單個實例(這樣外部服務可以通過IP將來自我的服務器的請求列入白名單)。 我通過分配彈性IP然后在創建啟動配置 - >配置詳細信息 - >高級詳細信息 - >用戶數據中添加啟動腳本來解決它:

#!/bin/bash

# configure AWS
aws configure set aws_access_key_id {MY_ACCESS_KEY}
aws configure set aws_secret_access_key {MY_SECRET_KEY}
aws configure set region {MY_REGION}

# associate Elastic IP
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
ALLOCATION_ID={MY_EIP_ALLOC_ID}
aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOCATION_ID --allow-reassociation

如果實例向南,則Auto Scale Group會旋轉一個新實例,該實例將回收相同的彈性IP,並且白名單仍然有效。 (這基本上是Shlomo Swidler和Bless @ AWS建議的方法,只是更詳細一點。:-))

對於那些需要地址池的人來說,可以擴展這種方法以使用'aws ec2 describe-addresses'並選擇一個未分配給實例的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM