我创建了一个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 #>
答案 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