![](/img/trans.png)
[英]How do I associate mailto links with a PWA app on Windows 10?
[英]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.