Coder Social home page Coder Social logo

aws-iot-builder-tools / aws-greengrass-provisioner Goto Github PK

View Code? Open in Web Editor NEW
53.0 40.0 15.0 2.35 MB

Simplifies provisioning Greengrass Cores and building Greengrass Lambda functions

License: Apache License 2.0

Shell 5.24% Java 94.76%
greengrass aws-greengrass-provisioner aws-greengrass

aws-greengrass-provisioner's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar jpeddicord avatar kimsehwan96 avatar ritesh avatar rpcme avatar sshresthacp avatar timmattison avatar yunchancho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aws-greengrass-provisioner's Issues

Provisioner crashes using --ec2-launch

The provisioner creates the group and installation package, fails to obtain SSH keys to setup the ec2 instance.

[INFO] BasicDeploymentHelper: Deployment successful
[ERROR] AwsGreengrassProvisioner: Is a directory
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Is a directory
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.handleProvisionerFailure(AwsGreengrassProvisioner.java:45)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$main$0(AwsGreengrassProvisioner.java:31)
at io.vavr.control.Try.onFailure(Try.java:633)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.main(AwsGreengrassProvisioner.java:31)
Caused by: java.io.IOException: Is a directory
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:46)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:159)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
at java.nio.file.Files.read(Files.java:3105)
at java.nio.file.Files.readAllBytes(Files.java:3158)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.lambda$readFile$c72e3cae$1(IoHelper.java:64)
at io.vavr.control.Try.of(Try.java:75)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.readFile(IoHelper.java:64)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.IoHelper.readFileAsString(IoHelper.java:58)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIoHelper.lambda$getPrivateKeyFilesForSsh$0(BasicIoHelper.java:45)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIoHelper.getPrivateKeyFilesForSsh(BasicIoHelper.java:47)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIoHelper.lambda$getJschWithPrivateKeysLoaded$8d6a4564$1(BasicIoHelper.java:113)
at io.vavr.control.Try.of(Try.java:75)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIoHelper.getJschWithPrivateKeysLoaded(BasicIoHelper.java:113)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicIoHelper.getSshSessionTask(BasicIoHelper.java:143)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:742)
at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:55)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.executeOrDisplayHelp(Operation.java:34)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.lambda$execute$1(Operation.java:22)
at io.vavr.control.Try.onSuccess(Try.java:648)
at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.execute(Operation.java:22)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$null$2(AwsGreengrassProvisioner.java:80)
at java.util.Optional.map(Optional.java:215)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$run$da6d192b$1(AwsGreengrassProvisioner.java:80)
at io.vavr.control.Try.of(Try.java:75)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.run(AwsGreengrassProvisioner.java:75)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.runProvisioner(AwsGreengrassProvisioner.java:53)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$main$249538b4$1(AwsGreengrassProvisioner.java:30)
at io.vavr.control.Try.of(Try.java:75)
at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.main(AwsGreengrassProvisioner.java:30)

Starting a container created with --build-container fails

After creating a container with java -jar ../aws-greengrass-provisioner/build/libs/AwsGreengrassProvisioner.jar -g xx -d deployments/cdd-skeleton.conf -c -a X86_64 and then trying to start it with docker run -p 8883:8883 greengrass:xx it fails with:

Setting up greengrass daemon
Validating hardlink/softlink protection
Found cgroup subsystem:  name=systemd
Found cgroup subsystem:  pids
Found cgroup subsystem:  hugetlb
Found cgroup subsystem:  net_prio
Found cgroup subsystem:  perf_event
Found cgroup subsystem:  net_cls
Found cgroup subsystem:  freezer
Found cgroup subsystem:  devices
Found cgroup subsystem:  memory
Found cgroup subsystem:  blkio
Found cgroup subsystem:  cpuacct
Found cgroup subsystem:  cpu
Found cgroup subsystem:  cpuset
failed to create overlay fs for container nosysRootfs operation not permitted
The Greengrass daemon process with [pid = 62] died

Maybe I'm just missing something from the startup command?

Add integration tests to validate that Java, Python, and NodeJS builds work as expected

There are multiple scenarios that need to be tested with integration tests. They are a combination of the two ways GGP itself it can be run and the kinds of builds it can perform.

Ways to run GGP:

  • Native builds (running GGP from the JAR)
  • Docker builds (running GGP in Docker)

Kinds of builds it can perform:

  • Java functions
  • NodeJS functions without additional dependencies
  • NodeJS functions with additional dependencies
  • Python functions without additional dependencies
  • Python functions with additional dependencies
  • Combined builds (building Java + NodeJS + Python)

For the first pass that gives us 12 combinations of builds we need to test. The first step is to do this with a simple script and then move it to something more formal if necessary.

Docker launch of java functions fails

When launching java functions with --docker-launch the deployment fails because of seemingly missing java8 executable.

java -jar ../aws-greengrass-provisioner/build/libs/AwsGreengrassProvisioner.jar -g xx -d deployments/cdd-skeleton.conf --docker-launch

docker exec -it xx cat /greengrass/ggc/var/log/system/runtime.log

[2019-01-14T14:27:29.675Z][INFO]-Starting worker arn:aws:lambda:eu-west-1:xx:function:xx-CDDSkeletonJava:19
[2019-01-14T14:27:29.675Z][ERROR]-Deployment xx of type NewDeployment for group xx failed error: unable to create worker process for arn:aws:lambda:eu-west-1:xx:function:xx-CDDSkeletonJava:19. cannot find executable java8 under any of the provided paths [/usr/bin /usr/local/bin]
[2019-01-14T14:27:29.675Z][INFO]-Updating status to Failure of deployment xx for group xx

However java 8 is actually present in the container, just not in the path where ggc is looking for it. A quick fix for example is to create a symlink ln -s /etc/alternative/java /usr/local/bin/java8 and then redeploying the function.

Open ports for Lambda functions in EC2

Some example functions have an environment variable called PORT that is used to tell a pinned Greengrass Lambda function what port to listen on. When running in EC2 we should update the security groups so this function is accessible externally. When running in Docker we should map this port to the host.

Python dependencies fail intermittently on EC2

Error looks like this with --ec2-launch

install: unrecognized option '--upgrade'
Try 'install --help' for more information.
install: missing destination file operand after 'AWSIoTPythonSDK'
Try 'install --help' for more information.
install: missing destination file operand after 'mxnet'
Try 'install --help' for more information.
install: missing destination file operand after 'opencv-python'
Try 'install --help' for more information.

Add support for Greengrass Connectors

Add support for connectors, there appears to be a generic structure to the connector configuration. This needs to be a generic conf with a connector ARN and connector params so that you don't have to build something for each connector. All connectors have an ARN, I suspect many more will be coming.

Dependencies fail in Ubuntu 18.x

No dependencies get installed, throws a bunch of exceptions and even Python doesn't get installed so the core fails to start.

Clean up resources at completion of labs

Being OCD I would like my account cleaned up of any resources that were created during the lab(s) that are not cleaned up when deleting the cloud formation stack(s).

Switch Greengrass SDKs to v1.3

Greengrass SDKs are still at 1.2 even though we've switched to Greengrass Core version 1.7.0. These should be updated soon.

Infinite loop when SSH connection fails with '--ec2-launch'

If the SSH connection to an EC2 instance fails due to the wrong SSH key being used an infinite loop occurs where the provisioner just reports "Auth fail" forever. This needs to bail out in the normal timeout period or it needs to fail immediately.

Switch Docker clients

The library that we are using (docker-java) is showing signs of dying. We should switch to a library that is more actively maintained like Spotify's Docker library.

Document provisioner usage with maven based functions

Currently it is not immediately clear how the provisioner should be used with maven based functions. Looking at BasicMavenBuilder, it seems to be very opinionated but gives little information in the way of javadocs or other documentation.

I'm sure we can live with the hard coded values for now, but it should be clear what files are expected where. Maybe just a simple sample directory structure with explanations?

.
├── deployments
│   ├── deployment.defaults.conf
│   ├── function.defaults.conf
│   └── my-function.conf
├── foundation
│   ├── 1-I-wonder
│   ├── 2-what-should
│   └── 3-be-here
└── functions
    └── my-function
        └── function.conf

Provisioner can fail when calling describe-instance during --ec2-launch

See exception below, looks like there may need to be retries here.

software.amazon.awssdk.services.ec2.model.Ec2Exception: The instance ID 'i-05071b42256ca7e1d' does not exist (Service: Ec2, Status Code: 400, Request ID: e49fc004-c7c1-4bf8-b810-b8e4e69b229e)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.handleErrorResponse(HandleResponseStage.java:115)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.handleResponse(HandleResponseStage.java:73)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:58)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:41)
        at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:64)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:36)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:77)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:39)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage$RetryExecutor.doExecute(RetryableStage.java:113)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage$RetryExecutor.execute(RetryableStage.java:86)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:62)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:42)
        at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
        at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:57)
        at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:37)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.executeWithTimer(ApiCallTimeoutTrackingStage.java:80)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:60)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:42)
        at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
        at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:37)
        at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:26)
        at software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonSyncHttpClient.java:240)
        at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.invoke(BaseSyncClientHandler.java:96)
        at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:120)
        at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:73)
        at software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:44)
        at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:55)
        at software.amazon.awssdk.services.ec2.DefaultEc2Client.describeInstances(DefaultEc2Client.java:9429)
        at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:718)
        at com.awslabs.aws.greengrass.provisioner.implementations.helpers.BasicDeploymentHelper.execute(BasicDeploymentHelper.java:58)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.executeOrDisplayHelp(Operation.java:34)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.lambda$execute$1(Operation.java:22)
        at io.vavr.control.Try.onSuccess(Try.java:648)
        at com.awslabs.aws.greengrass.provisioner.interfaces.helpers.Operation.execute(Operation.java:22)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$null$2(AwsGreengrassProvisioner.java:83)
        at java.util.Optional.map(Optional.java:215)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$run$da6d192b$1(AwsGreengrassProvisioner.java:83)
        at io.vavr.control.Try.of(Try.java:75)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.run(AwsGreengrassProvisioner.java:78)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.runProvisioner(AwsGreengrassProvisioner.java:56)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.lambda$main$249538b4$1(AwsGreengrassProvisioner.java:30)
        at io.vavr.control.Try.of(Try.java:75)
        at com.awslabs.aws.greengrass.provisioner.AwsGreengrassProvisioner.main(AwsGreengrassProvisioner.java:30)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.