windows - 如何自动将弹性 IP 地址关联到 AutoScale 组中的 Windows 服务器?

标签 windows powershell amazon-web-services amazon-ec2

我正在尝试找到一个示例,以可靠地将同一弹性 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/

相关文章:

windows - 如何在 Windows 命令提示符下获取文件?

windows - 哪个存储库包含 LWP::Parallel::UserAgent?

windows - SysInternals WinObj 设备列表机制

windows - 如何使用 Windows 命令行下载文件而无需输入代理密码?

powershell - 自定义资源 : Is it okay to reapply settings every time?

java - 在 AWS Elastic Beanstalk 上部署 Spring Boot 应用程序——出现 502 错误

amazon-web-services - 如何一次删除多个Cloudformation堆栈?

windows - 使用批处理命令检查文件夹是否为空?

powershell - 如何排除压缩存档中的文件夹

amazon-web-services - 设计您的应用程序以处理Amazon SQS中的FIFO