aws-iot-builder-tools/aws-greengrass-provisioner

CertificateArn error on executing ggp.sh

Closed this issue · 9 comments

Hi,

Recently I faced a certificate error on executing ggp.sh.
I created new greengrass group, and then tried to update it.
Then, ggp.sh print out the following errors regarding certifcate.
Failed to invoke public com.awslabs.iot.data.CertificateArn() with no args

I run these steps for latest aws-greengrass-lambda-functions, same error occured.
I don't know why this happens exactly.

@timmattison, could you check this issue ?

MacBook-Pro:aws-greengrass-lambda-functions chan376$ ./ggp.sh -a X86_64 -g test111 -d deployments/python3-mqtt-client.conf
Using aws-greengrass-provisioner repo branch master
master: Pulling from timmattison/aws-greengrass-provisioner
Digest: sha256:1ccc35c255e0638026fd9781d43721c425cde2d66bd7fc736ba27d5cdf35ed85
Status: Image is up to date for timmattison/aws-greengrass-provisioner:master
sha256:4ba308501575d40f792c3a2f062b60175e4d059e1dab5cb957349e6cb5949c5f
a97794ac525ee044a9e75336d847cf07c25303770952ea685441c65e42bf75c4
[WARN] BasicDeploymentArgumentHelper: No MQTT port value was set, using default [8883]
[INFO] BasicDeploymentHelper: No environment variables specified in this deployment
[INFO] BasicDeploymentHelper: Creating a Greengrass group, if necessary
[INFO] BasicGreengrassHelper: Group already exists, not creating a new one
[INFO] BasicDeploymentHelper: Creating core thing
[INFO] BasicFunctionHelper: Enabled functions: 
[INFO] BasicFunctionHelper:   MqttClientPython3
[WARN] BasicConnectorHelper: No connectors enabled
[INFO] BasicDeploymentHelper: Creating connector definition
[INFO] BasicDeploymentHelper: Creating Greengrass core role [Greengrass_CoreRole]
[INFO] BasicV2IamHelper: Updating assume role policy for existing role [Greengrass_CoreRole]
[INFO] BasicDeploymentHelper: Attaching role policies to Greengrass core role [Greengrass_CoreRole]
[INFO] BasicDeploymentHelper: Creating Greengrass service role [Greengrass_ServiceRole]
[INFO] BasicV2IamHelper: Updating assume role policy for existing role [Greengrass_ServiceRole]
[INFO] BasicDeploymentHelper: Attaching role policies to Greengrass service role [Greengrass_ServiceRole]
[INFO] BasicDeploymentHelper: Associating Greengrass service role to account
[INFO] BasicIotHelper: - Attempting to reuse existing keys.
[ERROR] AwsGreengrassProvisioner: Failed to invoke public com.awslabs.iot.data.CertificateArn() with no args
java.lang.RuntimeException: Failed to invoke public com.awslabs.iot.data.CertificateArn() with no args
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:113)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212)
        at com.awslabs.aws.greengrass.provisioner.data.GsonAdaptersKeysAndCertificate$KeysAndCertificateTypeAdapter.readInCertificateArn(GsonAdaptersKeysAndCertificate.java:133)
        at com.awslabs.aws.greengrass.provisioner.data.GsonAdaptersKeysAndCertificate$KeysAndCertificateTypeAdapter.eachAttribute(GsonAdaptersKeysAndCertificate.java:108)
        at com.awslabs.aws.greengrass.provisioner.data.GsonAdaptersKeysAndCertificate$KeysAndCertificateTypeAdapter.readKeysAndCertificate(GsonAdaptersKeysAndCertificate.java:96)
        at com.awslabs.aws.greengrass.provisioner.data.GsonAdaptersKeysAndCertificate$KeysAndCertificateTypeAdapter.read(GsonAdaptersKeysAndCertificate.java:70)
        at com.awslabs.aws.greengrass.provisioner.data.GsonAdaptersKeysAndCertificate$KeysAndCertificateTypeAdapter.read(GsonAdaptersKeysAndCertificate.java:35)
        at com.google.gson.Gson.fromJson(Gson.java:932)
        at com.google.gson.Gson.fromJson(Gson.java:897)
        at com.google.gson.Gson.fromJson(Gson.java:846)
        at com.google.gson.Gson.fromJson(Gson.java:817)
        at com.awslabs.general.helpers.implementations.BasicJsonHelper.fromJson(BasicJsonHelper.java:38)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.lambda$deserializeObject$c02ed260$1(IoHelper.java:151)
        at io.vavr.control.Try.of(Try.java:75)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.deserializeObject(IoHelper.java:151)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.deserializeKeys(IoHelper.java:167)
        at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIotHelper.loadKeysAndCertificate(BasicIotHelper.java:63)
        at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:656)
        at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:67)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.executeOrDisplayHelp(Operation.java:33)
        at io.vavr.control.Try.onSuccess(Try.java:712)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.execute(Operation.java:21)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$run$3(AwsGreengrassProvisioner.java:81)
        at java.base/java.util.Optional.map(Optional.java:265)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$run$da6d192b$1(AwsGreengrassProvisioner.java:81)
        at io.vavr.control.Try.of(Try.java:75)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.run(AwsGreengrassProvisioner.java:76)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.runProvisioner(AwsGreengrassProvisioner.java:56)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$main$0(AwsGreengrassProvisioner.java:29)
        at io.vavr.control.Try.run(Try.java:118)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.main(AwsGreengrassProvisioner.java:29)
Caused by: java.lang.InstantiationException
        at java.base/jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:110)
        ... 30 more
[ERROR] AwsGreengrassProvisioner: Failed to invoke public com.awslabs.iot.data.CertificateArn() with no args

That’s odd. That is a new class though. Will investigate tomorrow.

I just found if ggp.sh is executed with --certifcate-arn option and its value, it works perfectly. But I wonder that the option is to be mandatory recently for deploy a greengrass group already created.

No, this is definitely a bug. Your workaround is sufficient for now but I definitely broke something that I didn't test very well. I'm working on it.

This is uglier than I thought. On one JVM it works fine, on another it doesn't. Requires more time to get something stable. Sorry for the inconvenience.

I think I figured it out. Running some tests now. Will be updated either tonight or tomorrow morning.

@timmattison, thanks for your quick response. I will try to run ggp.sh if fixed version is applied.

It may not work on a group that has an invalid credentials file saved. So try it with a new group if that fails.

BTW, with #564 you can now update a group even if the credentials directory is missing.

Closing for now, please reopen if it is still an issue.