我正在尝试找到一个示例,以可靠地将同一弹性 IP 地址关联到属于 AutoScale 组的 Windows Server。本质上,目标是处理服务器通过 AutoScale 终止和替换的情况,并保持相同的公共(public) IP(远程提供的服务需要)。
AutoScale 组配置为仅允许最多 1 台服务器和最少 1 台服务器用于自动恢复方案。服务器位于 VPC 中,本质上是需要静态寻址的远程 Web 队列的 worker 。
我还想利用 IAM 角色,这样我就不必在 UserData 提供的脚本中嵌入 AWS 凭证。目前我正在寻找一个示例 powershell 脚本,但如果有人知道更好的方法,我当然愿意接受建议。我已经看到了一些较旧的示例,但它们已过时并且正在使用我想避免的嵌入式 AWS 凭证。
最佳答案
这是我们使用的:
在自动缩放组的启动配置中,指定以下用户数据:
<script>
PowerShell -ExecutionPolicy Bypass -NoProfile -File c:\tools\server_userdata.ps1 -instanceEIP eipalloc-abcdefg
</script>
将 EIP 标识符 eipalloc-abcdefg
传递给脚本。当然,将其更改为您的 EIP。
我们在实例上预先烘焙用户数据脚本本身,而不是将完整脚本传递给用户数据。我们通常在这个脚本中做很多配置;我在这里将其缩减为仅分配 EIP。使用预烘焙脚本,我们可以在各种实例功能和环境上共享相同的脚本,并通过仅通过用户数据传递参数来控制该实例的配置,脚本中没有任何静态编码。
另请注意,我们使用转录文件和 Windows 事件日志条目来简化故障排除。
c:\tools\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"
}
]
}
关于windows - 如何自动将弹性 IP 地址关联到 AutoScale 组中的 Windows 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38025290/