flaky-pizza-91785
08/13/2024, 9:41 PMfunc PulumiOps(program func(ctx *pulumi.Context) error, project_name, stack_name, region string, vpcProgram pulumi.RunFunc, ctx context.Context) (auto.OutputMap, error) {
stack, err := auto.UpsertStackInlineSource(ctx, stack_name, project_name, vpcProgram)
if err != nil {
logrus.Error("Could not create stack: ", err)
return auto.OutputMap{}, err
}
err = stack.SetConfig(ctx, "aws:region", auto.ConfigValue{Value: region})
if err != nil {
logrus.Error("Could not set config: ", err)
return auto.OutputMap{}, err
}
// Create a new VPC with a public and private subnet.
func A(ctx *pulumi.Context) err
vpc, err := awsx.NewVpc(ctx, project_name, &awsx.VpcArgs{
CidrBlock: pulumi.StringRef("10.0.0.0/16"),
Tags: pulumi.StringMap{
"Name": pulumi.String(project_name),
},
NumberOfAvailabilityZones: pulumi.IntRef(4),
SubnetSpecs: []awsx.SubnetSpecArgs{
{
<other args>
ctx.Export("vpcId", vpc.VpcId)
func B(ctx *pulumi.Context) err
// Create an EKS cluster.
cluster, err := eks.NewCluster(ctx, project_name, &eks.ClusterArgs{
InstanceType: pulumi.String(eksNodeInstanceType),
VpcId: pulumi.Sprintf( vpcid),
PublicSubnetIds: vpc.PublicSubnetIds ,
PrivateSubnetIds: vpc.PrivateSubnetIds ,
MinSize: pulumi.Int(minClusterSize),
MaxSize: pulumi.Int(maxClusterSize),
DesiredCapacity: pulumi.Int(desiredClusterSize),
NodeAssociatePublicIpAddress: pulumi.BoolRef(false),
<other args>
ctx.Export("kubeconfig", cluster.kubeconfig)
So whenever I create VPC with
PulumiOps(.... B...) //snippet ---> This create the vpc correctly and I get the vpc id
Then the next time I want to create eks or any other resource using
Pulumi(...A...) ----->>> This subsequent resource deletes everything that was created by vpc.
The requirement is to call func A first. Wait for to finish then somewhere else, func B is called and provided with vpcid from func A.
func A works perfect, func B deletes all the resources
That works perfectly, I get vpc id and store it somewhere
Why is this happening and how can I fix it. Thank you very much.modern-zebra-45309
08/13/2024, 11:29 PMflaky-pizza-91785
08/14/2024, 4:05 PMhallowed-photographer-31251
08/14/2024, 4:57 PMflaky-pizza-91785
08/14/2024, 5:00 PMflaky-pizza-91785
08/14/2024, 5:01 PMflaky-pizza-91785
08/14/2024, 5:04 PM_, err := awsec2.NewVpc(ctx, project_name, &awsec2.VpcArgs{}, pulumi.Import(pulumi.ID(vpc_id)))
if err != nil {
logrus.Error("Could not retrieve VPC", err)
return nil, err
}
flaky-pizza-91785
08/14/2024, 5:13 PMaws:ec2:Vpc newproject-9478 **importing failed** error: inputs to import do not match the existing resource
hallowed-photographer-31251
08/14/2024, 5:15 PMflaky-pizza-91785
08/14/2024, 5:27 PMpackage main
import (
"context"
"fmt"
"<http://github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2|github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2>"
"<http://github.com/pulumi/pulumi-aws/sdk/v5/go/aws/eks|github.com/pulumi/pulumi-aws/sdk/v5/go/aws/eks>"
"<http://github.com/pulumi/pulumi/sdk/v3/go/auto|github.com/pulumi/pulumi/sdk/v3/go/auto>"
"<http://github.com/pulumi/pulumi/sdk/v3/go/pulumi|github.com/pulumi/pulumi/sdk/v3/go/pulumi>"
"<http://github.com/sirupsen/logrus|github.com/sirupsen/logrus>"
)
// PulumiOps function that runs Upsert
func PulumiOps(program func(ctx *pulumi.Context) error, projectName, stackName, region string, ctx context.Context) (auto.OutputMap, error) {
stack, err := auto.UpsertStackInlineSource(ctx, stackName, projectName, program)
if err != nil {
logrus.Error("Could not create stack: ", err)
return auto.OutputMap{}, err
}
err = stack.SetConfig(ctx, "aws:region", auto.ConfigValue{Value: region})
if err != nil {
logrus.Error("Could not set config: ", err)
return auto.OutputMap{}, err
}
// Run Pulumi program
upResult, err := stack.Up(ctx)
if err != nil {
logrus.Error("Failed to run stack update: ", err)
return auto.OutputMap{}, err
}
return upResult.Outputs, nil
}
// VPC Creation Program (A)
func CreateVPC(ctx *pulumi.Context) error {
vpc, err := ec2.NewVpc(ctx, "my-vpc", &ec2.VpcArgs{
CidrBlock: pulumi.String("10.0.0.0/16"),
Tags: pulumi.StringMap{
"Name": pulumi.String("my-vpc"),
},
})
if err != nil {
return err
}
ctx.Export("vpcId", vpc.ID())
return nil
}
// EKS Creation Program (B)
func CreateEKS(ctx *pulumi.Context, vpcID pulumi.IDInput) error {
// Import the existing VPC resource
vpc, err := ec2.NewVpc(ctx, "imported-vpc", &ec2.VpcArgs{}, pulumi.Import(vpcID))
if err != nil {
return err
}
// Lookup the subnets associated with the VPC
subnets, err := ec2.GetSubnets(ctx, &ec2.GetSubnetsArgs{
Filters: []ec2.GetSubnetsFilter{
{
Name: "vpc-id",
Values: []string{vpcID.String()},
},
},
})
if err != nil {
return err
}
// Classify subnets into public and private
var publicSubnetIDs pulumi.StringArray
var privateSubnetIDs pulumi.StringArray
for _, subnetID := range subnets.Ids {
subnet, err := ec2.LookupSubnet(ctx, &ec2.LookupSubnetArgs{
Id: &subnetID,
})
if err != nil {
return err
}
if subnet.MapPublicIpOnLaunch {
publicSubnetIDs = append(publicSubnetIDs, pulumi.String(subnetID))
} else {
privateSubnetIDs = append(privateSubnetIDs, pulumi.String(subnetID))
}
}
// Create the EKS cluster using the imported VPC and discovered subnets
cluster, err := eks.NewCluster(ctx, "my-eks-cluster", &eks.ClusterArgs{
VpcConfig: &eks.ClusterVpcConfigArgs{
VpcId: vpc.ID(),
SubnetIds: publicSubnetIDs,
PrivateSubnetIds: privateSubnetIDs,
},
})
if err != nil {
return err
}
ctx.Export("kubeconfig", cluster.Kubeconfig)
return nil
}
func main() {
ctx := context.Background()
// First, run the VPC creation program
outputs, err := PulumiOps(CreateVPC, "my-project", "my-vpc-stack", "us-east-1", ctx)
if err != nil {
logrus.Fatal("Failed to create VPC: ", err)
}
// Get the VPC ID from the outputs
vpcID := outputs["vpcId"].Value.(string)
// Now, run the EKS creation program using the VPC ID
_, err = PulumiOps(func(ctx *pulumi.Context) error {
return CreateEKS(ctx, pulumi.ID(vpcID))
}, "my-project", "my-eks-stack", "us-east-1", ctx)
if err != nil {
logrus.Fatal("Failed to create EKS cluster: ", err)
}
fmt.Println("EKS cluster created successfully")
}
hallowed-photographer-31251
08/14/2024, 5:34 PMFollow up question, pulumi has pulumi import right?it does, but i don’t think you need it in this case. the vpc’s ID should be enough to get subnets etc.
modern-zebra-45309
08/14/2024, 6:40 PMflaky-pizza-91785
08/14/2024, 8:09 PMpackage main
import (
"context"
"fmt"
"<http://github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2|github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ec2>"
"<http://github.com/pulumi/pulumi-aws/sdk/v5/go/aws/eks|github.com/pulumi/pulumi-aws/sdk/v5/go/aws/eks>"
"<http://github.com/pulumi/pulumi/sdk/v3/go/auto|github.com/pulumi/pulumi/sdk/v3/go/auto>"
"<http://github.com/pulumi/pulumi/sdk/v3/go/pulumi|github.com/pulumi/pulumi/sdk/v3/go/pulumi>"
"<http://github.com/sirupsen/logrus|github.com/sirupsen/logrus>"
)
// PulumiOps function that runs Upsert
func PulumiOps(program func(ctx *pulumi.Context) error, projectName, stackName, region string, ctx context.Context) (auto.OutputMap, error) {
stack, err := auto.UpsertStackInlineSource(ctx, stackName, projectName, program)
if err != nil {
logrus.Error("Could not create stack: ", err)
return auto.OutputMap{}, err
}
err = stack.SetConfig(ctx, "aws:region", auto.ConfigValue{Value: region})
if err != nil {
logrus.Error("Could not set config: ", err)
return auto.OutputMap{}, err
}
// Run Pulumi program
upResult, err := stack.Up(ctx)
if err != nil {
logrus.Error("Failed to run stack update: ", err)
return auto.OutputMap{}, err
}
return upResult.Outputs, nil
}
// VPC Creation Program (A)
func CreateVPC(ctx *pulumi.Context) error {
vpc, err := ec2.NewVpc(ctx, "my-vpc", &ec2.VpcArgs{
CidrBlock: pulumi.String("10.0.0.0/16"),
Tags: pulumi.StringMap{
"Name": pulumi.String("my-vpc"),
},
})
if err != nil {
return err
}
ctx.Export("vpcId", vpc.ID())
return nil
}
// EKS Creation Program (B)
func CreateEKS(ctx *pulumi.Context, vpcID pulumi.IDInput) error {
// Import the existing VPC resource
vpc, err := ec2.NewVpc(ctx, "imported-vpc", &ec2.VpcArgs{}, pulumi.Import(vpcID))
if err != nil {
return err
}
// Lookup the subnets associated with the VPC
subnets, err := ec2.GetSubnets(ctx, &ec2.GetSubnetsArgs{
Filters: []ec2.GetSubnetsFilter{
{
Name: "vpc-id",
Values: []string{vpcID.String()},
},
},
})
if err != nil {
return err
}
// Classify subnets into public and private
var publicSubnetIDs pulumi.StringArray
var privateSubnetIDs pulumi.StringArray
for _, subnetID := range subnets.Ids {
subnet, err := ec2.LookupSubnet(ctx, &ec2.LookupSubnetArgs{
Id: &subnetID,
})
if err != nil {
return err
}
if subnet.MapPublicIpOnLaunch {
publicSubnetIDs = append(publicSubnetIDs, pulumi.String(subnetID))
} else {
privateSubnetIDs = append(privateSubnetIDs, pulumi.String(subnetID))
}
}
// Create the EKS cluster using the imported VPC and discovered subnets
cluster, err := eks.NewCluster(ctx, "my-eks-cluster", &eks.ClusterArgs{
VpcConfig: &eks.ClusterVpcConfigArgs{
VpcId: vpc.ID(),
SubnetIds: publicSubnetIDs,
PrivateSubnetIds: privateSubnetIDs,
},
})
if err != nil {
return err
}
ctx.Export("kubeconfig", cluster.Kubeconfig)
return nil
}
func main() {
ctx := context.Background()
// First, run the VPC creation program
outputs, err := PulumiOps(CreateVPC, "my-project", "my-vpc-stack", "us-east-1", ctx)
if err != nil {
logrus.Fatal("Failed to create VPC: ", err)
}
// Get the VPC ID from the outputs
vpcID := outputs["vpcId"].Value.(string)
// Now, run the EKS creation program using the VPC ID
_, err = PulumiOps(func(ctx *pulumi.Context) error {
return CreateEKS(ctx, pulumi.ID(vpcID))
}, "my-project", "my-eks-stack", "us-east-1", ctx)
if err != nil {
logrus.Fatal("Failed to create EKS cluster: ", err)
}
fmt.Println("EKS cluster created successfully")
}
Am in the deep waters here and I must learn how to swim. This gives me this aws:ec2:Vpc newproject-9478 **importing failed** error: inputs to import do not match the existing resource
There should be a way to import resources before they are used. No?
Imagine you are developing an API where you have endpoints that gets triggered along the way.modern-zebra-45309
08/14/2024, 8:13 PMflaky-pizza-91785
08/14/2024, 8:13 PMmodern-zebra-45309
08/14/2024, 8:13 PMmodern-zebra-45309
08/14/2024, 8:14 PMflaky-pizza-91785
08/14/2024, 8:14 PMflaky-pizza-91785
08/14/2024, 8:15 PMmodern-zebra-45309
08/14/2024, 8:16 PMflaky-pizza-91785
08/14/2024, 8:16 PMflaky-pizza-91785
08/14/2024, 8:17 PMmodern-zebra-45309
08/14/2024, 8:18 PMmodern-zebra-45309
08/14/2024, 8:18 PMmodern-zebra-45309
08/14/2024, 8:20 PMflaky-pizza-91785
08/14/2024, 8:21 PMmodern-zebra-45309
08/14/2024, 8:22 PMmodern-zebra-45309
08/14/2024, 8:24 PMmain.go
that creates the VPC and exports the VPC ID as an output,. Then you can modify the EKS Pulumi program to refer to this output via a stack referenceflaky-pizza-91785
08/14/2024, 8:25 PMflaky-pizza-91785
08/14/2024, 8:25 PMmodern-zebra-45309
08/14/2024, 8:28 PM