Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Bug] Exception: VPC não pode ser null

Estou com um problema há um tempo, e não consigo entender o que está acontecendo. na classe principal, tudo parece estar passando normalmente, exceto o "AluraRdsStack", (no caso do meu código é ferreira,mas enfim, vou enviar a classe aqui)

import software.amazon.awscdk.App;

public class FerreiraAwsInfraApp {
    public static void main(final String[] args) {
        App app = new App();

        FerreiraVpcStack vpcStack = new FerreiraVpcStack(app, "Vpc");
        FerreiraClusterStack clusterStack = new FerreiraClusterStack(app, "Cluster", vpcStack.getVpc());
        clusterStack.addDependency(vpcStack);

        FerreiraRdsStack rdsStack = new FerreiraRdsStack(app, "Rds", vpcStack.getVpc());
        rdsStack.addDependency(vpcStack);

        FerreiraServiceStack ferreiraServiceStack = new FerreiraServiceStack(app, "Service", clusterStack.getCluster());
        ferreiraServiceStack.addDependency(clusterStack);
        ferreiraServiceStack.addDependency(rdsStack);
        app.synth();
    }
}

Ao fazer o deploy, me volta o seguinte erro:

PS C:\Users\Edmilson Ferreira\Desktop\ALURA\ferreirafood-aws-infra> cdk deploy Service
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java (default-cli) on project ferreirafood-aws-infra: An exception occurred while executin
g the Java class. VPC não deve ser nula -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java (default-cli) on project ferreirafood
-aws-infra: An exception occurred while executing the Java class. VPC não deve ser nula

Eu joguei um throw para caso a vpc estivesse vindo nula (era o que parecia estar acontecendo segundo o erro, vou disponibilizar agora a classe FerreiraRdsStack(seria a alurardsstack)


public class FerreiraRdsStack extends Stack {
    public FerreiraRdsStack(final Construct scope, final String id, final Vpc vpc) {

        this(scope, id, null, vpc);
    }

    public FerreiraRdsStack(final Construct scope, final String id, final StackProps props, final Vpc vpc) {
        super(scope, id, props);
        if (vpc == null) {
            throw new IllegalArgumentException("VPC não deve ser nula");
        }
        String securityGroup = vpc.getVpcDefaultSecurityGroup();

        CfnParameter senha = CfnParameter.Builder.create(this, "senha")
                .type("String")
                .description("Senha do database pedidos-ms")
                .build();

        ISecurityGroup iSecurityGroup = SecurityGroup.fromSecurityGroupId(this, id, vpc.getVpcDefaultSecurityGroup());
        iSecurityGroup.addIngressRule(Peer.anyIpv4(), Port.tcp(3306));

        DatabaseInstance database = DatabaseInstance.Builder
                .create(this, "Rds-pedidos")
                .instanceIdentifier("ferreira-aws-pedido-db")
                .engine(DatabaseInstanceEngine.mysql(MySqlInstanceEngineProps.builder()
                        .version(MysqlEngineVersion.VER_8_0)
                        .build()))
                .vpc(vpc)
                .credentials(Credentials.fromUsername("admin",
                     CredentialsFromUsernameOptions.builder()
                        .password(SecretValue.unsafePlainText(senha.getValueAsString()))
                        .build()))
                .instanceType(InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.MICRO))
                .multiAz(false)
                .allocatedStorage(10)
                .securityGroups(Collections.singletonList(iSecurityGroup))
                .vpcSubnets(SubnetSelection.builder()
                        .subnets(vpc.getPrivateSubnets())
                        .build())
                .build();

        CfnOutput.Builder.create(this, "pedidos-db-endpoint")
                .exportName("pedidos-db-endpoint")
                .value(database.getDbInstanceEndpointAddress())
                .build();


        CfnOutput.Builder.create(this, "pedidos-db-senha")
                .exportName("pedidos-db-senha")
                .value(senha.getValueAsString())
                .build();
    }
}

Enfim, não sei se passou coisa mínima que não consegui ver, mas estou travado nisso há um certo tempo, e tive que recorrer ao forum :)

3 respostas

Eu to indo e voltando mas não sei pq esta voltando null o VPC nesse trecho FerreiraRdsStack rdsStack = new FerreiraRdsStack(app, "Rds", vpcStack.getVpc()); já que ta igual o cluster, e ele nao esta dando esse problema

Oi Edmilson! Tudo bem?

O erro que você está enfrentando indica que a VPC está sendo passada como null para a sua classe FerreiraRdsStack. Vamos verificar alguns pontos para garantir que a VPC está sendo corretamente inicializada e passada.

Primeiro, vamos dar uma olhada na inicialização da VPC na sua classe FerreiraAwsInfraApp:

FerreiraVpcStack vpcStack = new FerreiraVpcStack(app, "Vpc");
FerreiraClusterStack clusterStack = new FerreiraClusterStack(app, "Cluster", vpcStack.getVpc());
clusterStack.addDependency(vpcStack);

FerreiraRdsStack rdsStack = new FerreiraRdsStack(app, "Rds", vpcStack.getVpc());
rdsStack.addDependency(vpcStack);

Aqui, você está criando a FerreiraVpcStack e passando a VPC para o FerreiraClusterStack e FerreiraRdsStack. Certifique-se de que o método getVpc() da classe FerreiraVpcStack esteja retornando a VPC corretamente.

Vamos verificar a classe FerreiraVpcStack para garantir que a VPC está sendo inicializada corretamente:

public class FerreiraVpcStack extends Stack {
    private final Vpc vpc;

    public FerreiraVpcStack(final Construct scope, final String id) {
        super(scope, id);

        this.vpc = Vpc.Builder.create(this, "VPC")
            .maxAzs(3)  // Default is all AZs in region
            .build();
    }

    public Vpc getVpc() {
        return vpc;
    }
}

Certifique-se de que a VPC está sendo criada e atribuída à variável vpc corretamente. O método getVpc() deve retornar essa VPC sem problemas.

Além disso, na classe FerreiraRdsStack, você já está verificando se a VPC é null e lançando uma exceção, o que é uma boa prática:

public FerreiraRdsStack(final Construct scope, final String id, final Vpc vpc) {
    this(scope, id, null, vpc);
}

public FerreiraRdsStack(final Construct scope, final String id, final StackProps props, final Vpc vpc) {
    super(scope, id, props);
    if (vpc == null) {
        throw new IllegalArgumentException("VPC não deve ser nula");
    }
    // Resto do código...
}

Se tudo estiver correto até aqui e o problema persistir, pode ser útil adicionar alguns logs para depuração. Por exemplo, você pode adicionar um System.out.println para verificar se a VPC está realmente sendo passada como null:

public FerreiraRdsStack(final Construct scope, final String id, final Vpc vpc) {
    this(scope, id, null, vpc);
}

public FerreiraRdsStack(final Construct scope, final String id, final StackProps props, final Vpc vpc) {
    super(scope, id, props);
    if (vpc == null) {
        System.out.println("A VPC está nula!");
        throw new IllegalArgumentException("VPC não deve ser nula");
    } else {
        System.out.println("A VPC não está nula!");
    }
    // Resto do código...
}

Isso pode ajudar a identificar se o problema está na passagem da VPC ou em algum outro ponto do código.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.
solução!

AEEeeee!! Eu estava atribuindo a vpc de forma errônea no meu constructor da classe FerreiraVpcStack, eu deveria passar como this.vpc = Vpc.Builder... porém eu estava passando como "Vpc vpc = Vpc.Builder..." por isso não estava passando a VPC de forma correta, e o constructor não lia e mandava null. Obrigadoooooo mano!!!