基于动态IP错误更新AWS安全组的Powershell脚本

时间:2018-08-26 10:55:27

标签: amazon-web-services powershell aws-vpc

我创建了一个Powershell脚本,该脚本将在Task Scheduler中运行,以根据我的公共IP地址更新我的AWS安全组。当我运行此脚本时,我收到一条错误消息,该消息张贴在下面。

我也希望您能帮助您修改以下脚本,以便在更新为新IP地址时删除旧IP地址。

脚本

# to get current ip address in cidr format 

$ipinfo = Invoke-RestMethod http://ipinfo.io/json

$ipinfo.ip | out-file -filepath currentip -NoNewline

$ipCidr = Add-Content -Path "currentip" -Value "/32"     

# take current ip address and update the security group 
# the second part I am getting an error message pasted below 

$ipchange =  @{ IpProtocol="tcp"; FromPort="1433"; ToPort="1433"; IpRanges=$ipCidr}

Grant-EC2SecurityGroupIngress -GroupId sg-0d28d1cbc04d5df91 -Region us-east-2 -IpPermission @($ipchange)

错误

  

<#Grant-EC2SecurityGroupIngress:无法绑定参数   'IpPermission'。无法创建类型的对象   “ Amazon.EC2.Model.IpPermission”。类型的对象   'System.Management.Automation.PSObject'无法转换为类型   'System.Collections.Generic.List`1 [System.String]'。在   C:\ users \ inayet \ desktop \ aws-amazon \ scripts \ runCurrentIP.ps1:15 char:93   + ... pId sg-0d28d1cbc04d5df91-地区us-east-2 -IpPermission @($ ipchange)   + ~~~~~~~~~~~~~       + CategoryInfo:InvalidArgument:(:) [Grant-EC2SecurityGroupIngress],ParameterBindingException       + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Amazon.PowerShell.Cmdlets.EC2.GrantEC2SecurityGroupIngressCmdlet   #>

3 个答案:

答案 0 :(得分:0)

要解决类型转换错误消息,请在添加内容行下方添加此代码。

$ ipCidr = $ ipCidr -as [int]

您要说的是要将$ ipCidr中存储的字符串值转换为整数值。

现在出现另一个问题是变量$ ipCidr = Add-Content -Path“ currentip” -Value“ / 32” -NoNewline 不输出值。

当我使用currentip时,我得到了正确的ip cidr地址,但是当我输出$ ipCidr的值时,该文件为空,并且得到了以下错误消息“您不能在空值表达式上调用方法”。

如何将currentip文件中存储的整数存储到变量$ ipCidr中?

答案 1 :(得分:0)

该错误消息似乎表明cmdlet Grant-EC2SecurityGroupIngress期望的对象类型为Amazon.EC2.Model.IpPermission,并且无法根据您传递的参数构造一个对象。

您的代码中怀疑有一行可以解释该错误:

$ipCidr = Add-Content -Path "currentip" -Value "/32"

Add-Content不会返回任何内容,只会向文件添加行,因此$ipCidr此时不包含任何内容。

您可能想尝试

$ipCidr = Get-Content -path "currentip"

在继续填充哈希表之前:

$ipchange =  @{ IpProtocol="tcp"; FromPort="1433"; ToPort="1433"; IpRanges=$ipCidr}

放在@()周围的数组语法$IpRanges也不是必需的,并且可能也是导致收到的错误消息的主要因素。

Grant-EC2SecurityGroupIngress -GroupId sg-0d28d1cbc04d5df91 -Region us-east-2 -IpPermission $ipchange

现在IpRanges成员不再为空,powershell可以将其转换为Amazon.EC2.Model.IpPermission

答案 2 :(得分:0)

感谢大家的贡献!

这是我遇到的问题的解决方案。

# to get current ip address in cidr format

$ipinfo = Invoke-RestMethod http://ipinfo.io/json

$ipinfo.ip +"/32" | out-file -filepath currentip -NoNewline

$ipCidr = Get-Content -Path currentip

$ipchange = @{ IpProtocol="tcp"; FromPort="1433"; ToPort="1433"; IpRanges=$ipCidr} $ipchange

Grant-EC2SecurityGroupIngress -GroupId sg-123456789 -Region us-east-2 -IpPermission $ipchange