使用AWS Powershell工具启动/停止AWS EC2实例

时间:2016-09-06 20:39:47

标签: powershell amazon-web-services

我正在尝试编写两个单独的脚本。一个脚本确定哪些EC2实例已停止,它启动它们并将其开始记录到文本文件中。

第二个脚本将读取文本文件并停止这些实例。为了调试/简单起见,我首先将两个脚本组合成一个脚本。

这是我的剧本:

$Instances = (Get-EC2Instance).instances
$start_instances = @()
$Instances | foreach { 
    $state = Get-EC2InstanceStatus -InstanceId $_.InstanceId  -IncludeAllInstance $true 
    $state = $state.InstanceState.Name

    if ($state -eq "stopped"){
        $start_instances += $_.InstanceId
    }
} 
[System.IO.File]::WriteAllText("C:\users\myusername\desktop\so.csv", $($start_instances  -join ','))

$shutdown_instances = [System.IO.File]::ReadAllText("C:\users\myusername\desktop\so.csv")

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Stop-EC2Instance -Instance $shutdown_instances

启动并记录正在运行的实例正常工作。它的停止实例失败了。

我收到以下错误:

Stop-EC2Instance : Invalid id: "i-99edd755,i-8d647f58"
At C:\users\myusername\Desktop\aws-test.ps1:28 char:1
+ Stop-EC2Instance -Instance $shutdown_instances
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdl

那些实例ID确实有效,所以我无法弄清楚为什么它会抱怨它。我是通过out-file将实例ID写入文件并通过get-content获取,但这似乎导致了不同的错误。

我假设问题与数据格式有关,一旦我将其从文本文件中拉出来。

修改 所以我把脚本改为:

 $start_instances = $start_instances | Select-Object @{Name='Name';Expression={$_}}
 $start_instances | Export-Csv -Delimiter ',' -NoTypeInformation -path C:\temp\instances.csv

 $stop_instances = @(Import-Csv -path C:\temp\instances.csv)

 $stop_instances | Stop-EC2Instance

但仍然出现错误:

Stop-EC2Instance : No instances specified
At C:\temp\aws-test.ps1:22 char:19
+ $stop_instances | Stop-EC2Instance
+                   ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdlet

我也试过了:

Stop-EC2Instance -InstanceID $stop_instances

但那也死了:

Stop-EC2Instance : No instances specified
At C:\temp\aws-test.ps1:22 char:1
+ Stop-EC2Instance -InstanceId $stop_instances
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdlet

1 个答案:

答案 0 :(得分:0)

InstanceId参数需要数组。

您可以先声明一个空数组

$EC2Instance =@()

然后使用Import-CSV并将其通过管道传递给空数组,并附加来自csv的每个值

Import-CSV C:\Temp\Instance.csv | Foreach-Object {$EC2Instance += $_.InstanceId}

echo $EC2Instance

$ EC2instance现在将在数组中具有所需的实例ID

然后您可以在命令中使用它

Stop-EC2instance -InstanceId $EC2instance

这对我有用。