英文:
Creating new ec2 instance using Pulumi on Golang gives unexpected MissingParameter ImageId error
问题
我正在尝试使用Pulumi和Golang创建一个新的AWS EC2实例。
这是我的函数:
ec2, errEc2 := ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
SubnetId: pulumi.String(subnet.Id),
Ami: pulumi.String("ami-0022f774911c1d690"),
AvailabilityZone: pulumi.String("us-east-1"),
InstanceType: pulumi.String("t3.micro"),
VpcSecurityGroupIds: pulumi.StringArray{secGroup.ID()},
Tags: pulumi.StringMap{
"Project": pulumi.String("projectName"),
"Name": pulumi.String("exampleName"),
"Environment": pulumi.String("staging"),
},
})
根据这个文档作为参考,我的输入参数看起来没问题。
但是当我运行pulumi up
时,我得到了这个奇怪的错误:
error: 1 error occurred:
* creating EC2 Instance: MissingParameter: The request must contain the parameter ImageId
status code: 400, request id: 91babb9b....
在文档或者网上都没有找到需要使用ImageId的要求,当我尝试将其提供给ec2.NewInstance
函数时,我得到了"unknown field"的语法错误。
注意:
我正在使用以下包:
github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2
github.com/pulumi/pulumi/sdk/v3/go/pulumi
英文:
I am trying to create a new AWS EC2 instance using Pulumi on Golang.
This is my function:
ec2, errEc2 := ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
SubnetId: pulumi.String(subnet.Id),
Ami: pulumi.String("ami-0022f774911c1d690"),
AvailabilityZone: pulumi.String("us-east-1"]),
InstanceType: pulumi.String("t3.micro"),
VpcSecurityGroupIds: pulumi.StringArray{secGroup.ID()},
Tags: pulumi.StringMap{
"Project": pulumi.String("projectName"),
"Name": pulumi.String("exampleName"),
"Environment": pulumi.String("staging"),
},
})
The input parameters look fine to me using this documentation as a reference
But when I am running
pulumi up
I get this weird error
error: 1 error occurred:
* creating EC2 Instance: MissingParameter: The request must contain the parameter ImageId
status code: 400, request id: 91babb9b....
Nowhere, inside the documentation or the web, have I found the need to use ImageId, and when I am trying to provide it to the ec2.NewInstance function, I get "unknown field" syntax error
Note:
And I am using the packages
github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2
github.com/pulumi/pulumi/sdk/v3/go/pulumi
答案1
得分: 0
我看到你的代码中有几个错误:
AvailabilityZone: pulumi.String("us-east-1"]),
这里多了一个 ]
,应该是:
AvailabilityZone: pulumi.String("us-east-1"),
此外,us-east-1
不是一个有效的可用区,你可能想要使用 us-east-1a
,所以最终应该是:
AvailabilityZone: pulumi.String("us-east-1a"),
关于你的镜像 ID 问题,我建议检查你引用的 AMI 是否确实存在于你的账户中。镜像 ID 属性是通过 Ami
id 发送的,所以应该足够了。
英文:
I see a few errors with your code:
AvailabilityZone: pulumi.String("us-east-1"]),
There's an extra ]
in here, it should be:
AvailabilityZone: pulumi.String("us-east-1"),
In addition to this, us-east-1
isn't a valid availability zone, you probably want us-east-1a
, so ultimately:
AvailabilityZone: pulumi.String("us-east-1a"),
With regards to your image id issue, I would check the AMI you're reference actually exists in your account. The image ID property is sent by the Ami
id, so that should be enough
答案2
得分: 0
修复了一个错误 - 我不知道问题是什么,因为id是相同的,但我修复的方法是这样的:
在之前使用LookupAmi函数:
func GetAmi(ctx *pulumi.Context, Ami map[string]string) (*ec2.LookupAmiResult, error){
ami, amiErr := ec2.LookupAmi(ctx, &ec2.LookupAmiArgs{
NameRegex: pulumi.StringRef(Ami["Name"]),
Owners: []string {
Ami["Owner"],
},
})
if amiErr != nil {
log.Fatal("尝试获取ami镜像时出错!", amiErr)
}
return ami, amiErr
}
然后只使用前一个函数中的ami.Id字段创建ec2实例:
ec2, errEc2 := ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
SubnetId: pulumi.String(subnet.Id),
Ami: pulumi.String(ami.Id),
AvailabilityZone: pulumi.String(Ec2["AvailabilityZone"]),
InstanceType: pulumi.String(Ec2["InstanceType"]),
VpcSecurityGroupIds: pulumi.StringArray{secGroup.ID()},
Tags: pulumi.StringMap{
"Project": pulumi.String(Ec2["Name"]),
"Name": pulumi.String(name),
"Environment": pulumi.String(environment),
},
})
if errEc2 != nil {
log.Fatalln("尝试创建ec2实例时出错!", errEc2)
}
return ec2, errEc2
英文:
Fixed the bug - I don't know what was the issue since the id's are identical, but the way I fixed it is by doing so:
use the LookupAmi func before:
func GetAmi(ctx *pulumi.Context, Ami map[string]string) (*ec2.LookupAmiResult, error){
ami, amiErr := ec2.LookupAmi(ctx, &ec2.LookupAmiArgs{
NameRegex: pulumi.StringRef(Ami["Name"]),
Owners: []string {
Ami["Owner"],
},
})
if amiErr != nil {
log.Fatal("Got error while trying to get ami image!", amiErr)
}
return ami, amiErr
}
And only then create the ec2 instance using the ami.Id field from the previous func:
ec2, errEc2 := ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
SubnetId: pulumi.String(subnet.Id),
Ami: pulumi.String(ami.Id),
AvailabilityZone: pulumi.String(Ec2["AvailabilityZone"]),
InstanceType: pulumi.String(Ec2["InstanceType"]),
VpcSecurityGroupIds: pulumi.StringArray{secGroup.ID()},
Tags: pulumi.StringMap{
"Project": pulumi.String(Ec2["Name"]),
"Name": pulumi.String(name),
"Environment": pulumi.String(environment),
},
})
if errEc2 != nil {
log.Fatalln("Got error while trying to create ec2 instance!", errEc2)
}
return ec2, errEc2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论