Git Product home page Git Product logo

gradle-aws-plugin's Introduction

Gradle AWS Plugin

Join the chat at https://gitter.im/gradle-aws-plugin/Lobby

Gradle plugin to manage AWS resources.

Current Features / Supported AWS Products

  • S3
    • Create bucket
    • Delete bucket
    • Upload object(s)
    • Delete object(s)
    • File sync
    • Set bucket policy
    • Set website configuration
  • EC2
    • Run instance
    • Start instance
    • Stop instance
    • Terminate instance
    • Import key
    • Create security group
    • Delete security group
    • Authorize security group ingress permissions
    • Authorize security group egress permissions
    • Revoke security group ingress permissions
    • Revoke security group egress permissions
    • Wait for specific status on instance
  • RDS
    • Create DB instance
    • Delete DB instance
    • Modify DB instance
    • Migrate (create or modify) DB instance
    • Reboot DB instance
    • Wait for specific status on DB instance
  • Route53
    • Create hosted zone
    • Delete hosted zone
    • Change record set
  • Elastic Beanstalk
    • Create or delete applications
    • Create or terminate environments
    • Create or delete configuration templates
    • Create or delete application versions
    • Wait for specific status on environment
  • CloudFormation
    • Migrate (create or update) stack
    • Delete stack
    • Wait for specific status on stack
  • Lambda
    • Create function
    • Update function code
    • Update function configuration
    • Migrate (create or update) function
    • Invoke function
    • Delete function
    • Publish function version
    • Create alias
    • Update alias
  • IAM
    • Create role
    • Attach role policy
  • ELB
    • (TBD)
  • SQS
    • Send messages
    • Delete messages
    • Read messages
  • SNS
    • Publish message
  • SSM
    • Put parameters

Requirements

  • Java 8+
  • Gradle 2.4+

Usage

Add this to your build.gradle:

buildscript {
  repositories {
    mavenCentral()
    maven { url "https://plugins.gradle.org/m2/" }
  }
  dependencies {
    classpath "jp.classmethod.aws:gradle-aws-plugin:0.30"
  }
}

apply plugin: 'jp.classmethod.aws'

aws {
  profileName = 'credentials-profile-name-in-your-profile-configuration-file (~/.aws/credentials)'
  region = 'ap-northeast-1'
}

These credentials are used to make API accesses by default. The format of the credentials file is described in the Amazon AWS Docs.

S3 Create bucket

apply plugin: 'jp.classmethod.aws.s3'

task createBucket(type: CreateBucketTask) {
	bucketName myBucketName

	// one of http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region values, us-east-1 by default
	region regionName
	// create bucket only if it does not exist, otherwise skip
	ifNotExists true
}

Look at S3 example 1 for more information.

S3 files tasks

apply plugin: 'jp.classmethod.aws.s3'

task syncObjects(type: jp.classmethod.aws.gradle.s3.SyncTask) {
  bucketName 'foobar.example.com'
  source file('path/to/objects')
}

Look at S3 example 1 and S3 example 2 for more information.

EC2 instance tasks

apply plugin: 'jp.classmethod.aws.ec2'

// You can overwrite default credentials and region settings like this:
// ec2 {
//   profileName 'another-credentials-profile-name' // optional
//   region = 'us-east-1'
// }

task stopBastion(type: jp.classmethod.aws.gradle.ec2.AmazonEC2StopInstanceTask) {
  instanceIds += 'i-12345678'
}

task startBastion(type: jp.classmethod.aws.gradle.ec2.AmazonEC2StartInstanceTask) {
  instanceIds += 'i-12345678'
}

Look at EC2 example for more information.

RDS DB instance tasks

apply plugin: "jp.classmethod.aws.rds"

// You can overwrite default credentials and region settings like this:
// rds {
//   profileName 'another-credentials-profile-name' // optional
//   region = 'us-east-1'
// }

task migrateDBInstance(type: AmazonRDSMigrateDBInstanceTask) {
	dbInstanceIdentifier = "foobar"
	allocatedStorage = 5
	dbInstanceClass = "db.t2.micro"
	engine = "MySQL"
	masterUsername = "root"
	masterUserPassword = "passW0rd"
	vpcSecurityGroupIds = [ "sg-d3958fbf" ]
	dbSubnetGroupName = "default"
	multiAZ = false
	publiclyAccessible = true
}

task rebootDBInstance(type: AmazonRDSRebootDBInstanceTask) {
	dbInstanceIdentifier = "foobar"
}

task deleteDBInstance(type: AmazonRDSDeleteDBInstanceTask) {
	dbInstanceIdentifier = "foobar"
	skipFinalSnapshot = true
}

Look at RDS example for more information.

Route 53 hosted zone tasks

apply plugin: 'jp.classmethod.aws.route53'

task createHostedZone(type: jp.classmethod.aws.gradle.route53.CreateHostedZoneTask) {
	hostedZoneName "foobar.example.com"
	callerReference '0BF44985-9D79-BF3B-A9B0-5AE24D6E86E1'
}

task deleteHostedZone(type: jp.classmethod.aws.gradle.route53.DeleteHostedZoneTask) {
	hostedZoneId "XXXX"
}

Look at Route 53 example for more information.

Elastic Beanstalk environment tasks

apply plugin: 'jp.classmethod.aws.beanstalk'
beanstalk {
  String extension = project.war.archiveName.tokenize('.').last()
  String timestamp = new Date().format("yyyyMMdd'_'HHmmss", TimeZone.default)

  appName 'foobar'
  appDesc 'foobar demo application'
  
  version {
    label = "foobar-${project.war.version}-${timestamp}"
    description = "${artifactId} v${version}"
    bucket = 'sample-bucket'
    key = "eb-apps/foobar-${project.war.version}-${timestamp}.${extension}"
  }
  
  configurationTemplates {
    production {
      optionSettings = file('src/main/config/production.json')
      solutionStackName = '64bit Amazon Linux 2013.09 running Tomcat 7 Java 7'
    }
    development {
      optionSettings = file('src/main/config/development.json')
      solutionStackName = '64bit Amazon Linux 2013.09 running Tomcat 7 Java 7'
    }
  }
  
  environment {
    envName = 'foobar'
    envDesc = 'foobar demo application development environment'
    templateName = 'development'
    versionLabel = "foobar-${project.war.version}-${timestamp}"
  }
}

// task awsEbMigrateEnvironment, awsEbDeleteApplication and so on are declared

Look Elastic Beanstalk example for more information.

CloudFormation stack tasks

apply plugin: 'jp.classmethod.aws.cloudformation'

cloudFormation {
  stackName 'foobar-stack'
  stackParams([
    Foo: 'bar',
    Baz: 'qux'
  ])
  stackTags([
    Bar: 'foo',
    Baz: 'fox'
  })
  capabilityIam true
  templateFile project.file("foobar.template")
  templateBucket 'example-bucket'
  templateKeyPrefix 'foobar/'
}

// awsCfnMigrateStack and awsCfnDeleteStack task (and so on) are declared.

Look at CloudFormation example for more information.

Lambda function tasks

apply plugin: "base"
apply plugin: "jp.classmethod.aws.lambda"
aws {
	profileName = "default"
	region = "ap-northeast-1"
}

lambda {
	region = "us-east-1"
}

task zip(type: Zip) {
	from "function/"
	destinationDir file("build")
}

task migrateFunction(type: AWSLambdaMigrateFunctionTask, dependsOn: zip) {
	functionName = "foobar"
	role = "arn:aws:iam::${aws.accountId}:role/lambda-poweruser"
	zipFile = zip.archivePath
	handler = "DecodeBase64.handler"
	alias = 'DEV'
	environment = [
	    p1: "Value",
	    p2: "Value2"
	]
	tags = [
	    p1: "Value",
	    p2: "Value2"    
	]
}

task invokeFunction(type: AWSLambdaInvokeTask) {
	functionName = "foobar"
	invocationType = InvocationType.RequestResponse
	payload = file("sample-input/input.txt")
	doLast {
		println "Lambda function result: " + new String(invokeResult.payload.array(), "UTF-8")
	}
}

task deleteFunction(type: AWSLambdaDeleteFunctionTask) {
	functionName = "foobar"
}

task publishVersionFunction(type: AWSLambdaPublishVersionTask, dependsOn: migrateFunction) {
	functionName = "foobar"
}

task createAlias(type: AWSLambdaCreateAliasTask, dependsOn: publishVersionFunction) {
	functionName = "foobar"
	aliasName = "alias"
	functionVersion = "1"
}

task updateAlias(type: AWSLambdaUpdateAliasTask, dependsOn: createAlias) {
	functionName = "foobar"
    aliasName = "alias"
	functionVersion = "1"
    routingConfig {
        additionalVersionWeight = 0.7
		useNextVersion = true
    }
}

task updateLambdaFunctionCode(type: AWSLambdaUpdateFunctionCodeTask) {
    functionName = "fooBar"
    zipFile = zip.archivePath
}

Look at Lambda example for more information.

SQS tasks

apply plugin: "jp.classmethod.aws.sqs"

task sendMessages(type: AmazonSQSSendMessagesTask) {
	queueName 'gradle-aws-plugin-sample'
	messages Stream.of("Test 1", "Test 2")
}

task deleteMessages(type: AmazonSQSMessageConsumerTask) {
	queueName 'gradle-aws-plugin-sample'
	showMessages false
}

task viewMessages(type: AmazonSQSMessageConsumerTask) {
	queueName 'gradle-aws-plugin-sample'
	deleteMessages false
	maxNumberOfMessages 50
}

Look at SQS example for more information.

SNS tasks

apply plugin: "jp.classmethod.aws.sns"

task publishMessage(type: AmazonSNSPublishMessageTask) {
	topicArn 'arn:aws:sns:us-east-1:000000000000:gradle-aws-plugin-sns-topic'
	message 'Test body'
	subject 'Optional test subject'
}

task publishJsonMessage(type: AmazonSNSPublishMessageTask) {
	topicArn 'arn:aws:sns:us-east-1:000000000000:gradle-aws-plugin-sns-topic'
	message JsonOutput.toJson(['default': 'Default message body.',
							   'email'  : 'Email message body.',
							   'sms': 'SMS message body.'])
	messageStructure 'json'
}

Look at SNS example for more information.

License

Copyright (C) 2013-2018 Classmethod, Inc.

Distributed under the Apache License v2.0. See the file copyright/LICENSE.txt.

Development and Contribution

We are open to contributions.

To contribute to the plugin or make your own modifications, including the ability to publish your build artifacts to your own Maven repository see: development.

gradle-aws-plugin's People

Contributors

adamantyr avatar atschabu avatar azihsoyn avatar brettduclos avatar centic9 avatar dai0304 avatar denuno avatar donalhenry avatar fpavageau avatar frankfarrell avatar gitter-badger avatar glebsts avatar imflog avatar inabajunmr avatar isaacaggrey avatar jansauer avatar kristoffersmedlund avatar linchpiner avatar lnr0626 avatar lugoues avatar mochizuki-masao avatar mrburrito avatar musketyr avatar rafe-delphix avatar robbypond avatar schultemarkus avatar sdavids13 avatar tellary avatar timyates avatar wgorski-antrego 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  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

gradle-aws-plugin's Issues

Lambda environment configuration fails when using 'GString' for value

lambda { 
   environment = [
      KEY:  "value/${with}/replacement"
  ] 
}

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':migrateSessionFunction'.
> Unable to marshall request to JSON: Unable to marshall request to JSON: org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.lang.String


Succeeds:

lambda { 
     def String value = "value/${with}/replacement"
   environment = [ 
      KEY:  value
  ] 
}

placeholder: support aws-java-sdk-events functionality

My usecase is that I deploy lambda code with this plugin, and I would like to add trigger for invoking this lambda every 5 min. Looked into AWS docs - there are events and rules, but currently I have to write cloudformation jsons for that.

Acceptance criteria

  • at least create, delete, enable and disable rule functionality is supported
  • stretch goal: invoking test event is supported (to test lambda invocation after deploy)

Execution failed

Hello everybody,

When I use AmazonS3PluginExtension in module.gradle it works fine, but when I try to move plugin to other.gradle file I get the following error. Any suggestions?:

Execution failed for task ':presentation:someRelease'.
Extension of type 'AmazonS3PluginExtension' does not exist. Currently registered extension types: [DefaultExtraPropertiesExtension, DefaultArtifactPublicationSet_Decorated, ReportingExtension_Decorated, AppExtension_Decorated, KaptExtension_Decorated, AwsPluginExtension_Decorated, AmazonS3PluginExtension_Decorated, SlackPluginExtension_Decorated]

AWSElasticBeanstalkCreateEnvironmentTask cannot update environment due to Tier limitation

I tried to use the task to change the deployed version of the app, and AWS returned this error:

Cannot change environment tier (Service: AWSElasticBeanstalk; Status Code: 400; Error Code: InvalidParameterValue

I am not trying to set the Tier, so this was confusing. The problem is that the environment's current tier does not have a version string (or it is not being returned as part of the describe call):

Tier: {Name: WebServer,Type: Standard,Version: }

But the task tries to set a tier with a version. I tried setting the tier to null, but then line 87 of AWSElasticBeanstalkCreateEnvironmentTask will get a NullPointerError. I then pulled a branch of the project and changed line 87 to do a safe dereference:

.withTier(tier?.toEnvironmentTier()))

This works. I set tier to null in my gradle file and the task will update the environment properly. Can you apply this change to the main build? Another option is to not include Tier in an update command because it is very rare that you would need to ever change it.

Feature Request: ECR

AWS has finally brought ECR live and having access to it from within a build tool makes a lot of sense. I would be willing to work on adding the feature but just want to make sure you all would be open to adding it.

S3 File Upload Task: resourceUrl should be populated even if nothing is uploaded

AmazonS3FileUploadTask has a property resourceUrl, which is set to the remote URL of the object in Amazon S3 before it's uploaded. Currently, it's only set if the upload will actually continue.

It's useful to reference this value in other tasks, so it would be nice to have it populated regardless of if the upload would continue or not.

Complier warning with new release

When building from either the master or develop branch (after release 0.31 created), I get the warning below:

$ gradlew clean jar
:clean
:compileJava
warning: No processor claimed any of these annotations: org.gradle.api.tasks.TaskAction,lombok.Setter,lombok.Getter,org.gradle.api.Nullable
/Users/dohenry/gradle_plugins/gradle-aws-plugin/src/main/java/jp/classmethod/aws/gradle/common/BasePluginExtension.java:41: warning: [unchecked] unchecked cast
        @Getter(lazy = true)
        ^
  required: T
  found:    Object
  where T is a type-variable:
    T extends AmazonWebServiceClient declared in class BasePluginExtension
2 warnings
:processResources
:classes
:jar

BUILD SUCCESSFUL

Support CloudFormation stack tags

The CreateStackRequest which is instantiated in the AmazonCloudFormationMigrateStackTask can handle tagging. However, there is no possibility to enter the tags into the process. That would be a really nice feature.

Upload Content S3 task fails with the exception of no signature of method.

Hi,

uploadContent task is failing with the following exception.

No signature of method: com.amazonaws.services.s3.AmazonS3Client.getResourceUrl() is applicable for argument types: (java.lang.String, java.lang.String, com.amazonaws.services.s3.model.ObjectMetadata) values: [ldswarehouse, jar/, com.amazonaws.services.s3.model.ObjectMetadata@c021e20]
Possible solutions: getResourceUrl(java.lang.String, java.lang.String)
at jp.classmethod.aws.gradle.s3.AmazonS3FileUploadTask.upload(AmazonS3FileUploadTask.groovy:58)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:226)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
... 69 more

Feature request: allow adding tags for the Beanstalk environment

When creating a Beanstalk environment it would be interesting to add Tags to it. Those would be used to tag the EC2 instances created within the environment.
They could be defined like:

environment {
        envName = "05-beanstalk-blue"
        envDesc = "foobar demo application blue environemnt"
        templateName = "development"
        versionLabel = "05-beanstalk-${versionDesc}"
        tags = [
                VERSION: "${versionDesc}".toString(),
                GROUP: "Eng"
        ]
    }

I have already implemented this, happy to do a PR to have it merged.

Thanks!

Throw in `AmazonCloudFormationPluginExtension` if stacks cannot be described

We need to distinguish the following 3 outcomes of the getStack call:

  1. Stack found by name.
  2. Stack with this name doesn't exist.
  3. Unable to get stack.

The 3rd outcome should be represented by an exception.

The getStack method currently logs an exception at debug (!) level and returns an empty Optional. This leads us to inability to distinguish whatever the stack doesn't exist or we aren't able to get it. In the later case we just want to terminate Gradle execution.

For example, we want to see simply the following in the gradle --stacktrace output if a user cannot authenticate to describe a stack:

com.amazonaws.AmazonClientException: Unable to load AWS credentials from any provider in the chain
    at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:131)
    ...
    at com.amazonaws.services.cloudformation.AmazonCloudFormationClient.describeStacks(AmazonCloudFormationClient.java:943)
    at jp.classmethod.aws.gradle.cloudformation.AmazonCloudFormationPluginExtension.getStack(AmazonCloudFormationPluginExtension.java:112)
    at jp.classmethod.aws.gradle.cloudformation.AmazonCloudFormationPluginExtension$getStack.call(Unknown Source)
    at build_b3pyhnx70z64rtnyfr59mg5hm$_run_closure4.doCall(/ssd/git/gw/loginservice/BuildInfo/build.gradle:50)
    ...

I'm about to submit a pull request that removes all occurences of try/catch and return empty behavior.

Also, could you please clarify the purpose of returning empty Optional if Gradle is offline? What is the following if statement for in AmazonCloudFormationPluginExtension?

public Optional<Stack> getStack(String stackName) {
    if (getProject().getGradle().getStartParameter().isOffline() == false) {

Allow ElasticBeanstalk Config Template to not set optionSettings

If I have a ConfigurationTemplate without optionSettings then it will fail with an NPE:

configurationTemplates {
    production {
         solutionStackName = '64bit Amazon Linux 2016.09 v2.3.1 running Tomcat 8 Java 8'
    }
}

I shouldn't have to provide optionSettings if I am not changing any options. Currently I workaround this by pointing to a file that contains an empty array: [].

s3 sync giving error

Hi I am getting this error when trying to use a sync task:

gradle syncObjects
:syncObjects FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':syncObjects'.
> bucketName is not specified

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 4.855 secs

Here is my build script:

buildscript {
  repositories {
    mavenCentral()
    maven { url 'http://public-maven.classmethod.info/release' }
  }
  dependencies {
    classpath 'jp.classmethod.aws:gradle-aws-plugin:0.14'
  }
}

apply plugin: 'aws'

aws {
  profileName 'default'
  //region = 's3-external-1.amazonaws.com'
  region = 'us-east-1'
}


apply plugin: 'aws-s3'


task syncObjects(type: jp.classmethod.aws.gradle.s3.SyncTask) <<{
    bucketName 'pipeline_test'
    source file('aaa.txt')
}

Full stack trace:

gradle syncObjects --stacktrace
:syncObjects FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':syncObjects'.
> bucketName is not specified

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':syncObjects'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51)
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:33)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: org.gradle.api.GradleException: bucketName is not specified
    at jp.classmethod.aws.gradle.s3.SyncTask.uploadAction(SyncTask.groovy:44)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 44 more


BUILD FAILED

Latest version missing dependency

I am attempting to build my project with the latest version (0.25) but I am receiving the following error:

Error:Could not find jp.xet.spar-wings:spar-wings-awscli-config:0.11.
Searched in the following locations:
https://repo1.maven.org/maven2/jp/xet/spar-wings/spar-wings-awscli-config/0.11/spar-wings-awscli-config-0.11.pom
https://repo1.maven.org/maven2/jp/xet/spar-wings/spar-wings-awscli-config/0.11/spar-wings-awscli-config-0.11.jar
https://plugins.gradle.org/m2/jp/xet/spar-wings/spar-wings-awscli-config/0.11/spar-wings-awscli-config-0.11.pom
https://plugins.gradle.org/m2/jp/xet/spar-wings/spar-wings-awscli-config/0.11/spar-wings-awscli-config-0.11.jar
Required by:
com.myproject:MyProject:1.0.0-SNAPSHOT > jp.classmethod.aws:gradle-aws-plugin:0.25

JDK 1.7 build?

Any chance you could do a release with sourceCompatibility = '1.7'?

Could not determine the dependencies of task ':awsEbUploadBundle'.

I tried to use the jp.classmethod.aws.beanstalk plugin but I get the following error:

$ gradle awsEbCreateApplicationVersion

FAILURE: Build failed with an exception.

  • What went wrong:
    Could not determine the dependencies of task ':awsEbUploadBundle'.
    > Cannot convert org.gradle.api.plugins.WarPlugin@5a539657 to a task.
    The following types/formats are supported:

    • A String or CharSequence task name or path
    • A Task instance
    • A Buildable instance
    • A TaskDependency instance
    • A Closure instance that returns any of the above types
    • A Callable instance that returns any of the above types
    • An Iterable, Collection, Map or array instance that contains any of the above types
  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1.653 secs

Invoking lambda with no payload gives NPE

https://github.com/classmethod/gradle-aws-plugin/blob/develop/src/main/java/jp/classmethod/aws/gradle/lambda/AWSLambdaInvokeTask.java#L98
if payload is not ByteBuffer, File or Closure, it calls payload.toString();
But according to http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html payload is not required parameter, so when I was invoking my lambda with InvocationType.Event, I did not set any payload, and it crashed when calling toString() on null.
I'm not sure to be honest, if this is a real bug, but I don't think that setting payload to empty string would be nice when I don't need any payload.
@dai0304 what do you think, should that be fixed, or not? I can send PR if it is considered to be a bug.

AmazonS3FileUploadTask finishes but the file isn't uploaded

hi, im developing a gradle process with AmazonS3FileUploadTask and trying to upload a file with it.

 task uploadContent(type: AmazonS3FileUploadTask) 
{
    println 'inside upload s3'
    file file("FILE_PATH")
    bucketName "plugin-layouts"
    key "KEY_NAME"
    /*def m = new ObjectMetadata()
    m.setCacheControl("no-cache, no-store")
    objectMetadata = m*/
    println 'end upload s3'
}

once i run "gradle war" i see the println rows, but the file aventually isn't uploaded
the FILE_PATH im giving is relative to the project's build.gradle file the task is in.

any ideas why is it happening?

S3 File Upload Tasks will overwrite changed files even when overwrite = false

On this line, The upload will be attempted if any of the following is true:

  • overwrite = true
  • there is no metadata for the file
  • the MD5 hash is not the same as the local version of the file.

This doesn't seem like the desirable behavior. The third condition should probably be seperate from the first two -- upload if overwrites are allowed or there is no metadata, AND the md5 hash is different.

Especially when you set overwrite like this:

overwrite version.endsWith("-SNAPSHOT")

path of "/" in AmazonIdentityManagementCreateRoleTask crashes buildship in eclipse.

Using a recent (1.17,2.0..) version of buildship + eclipse and gradle (3.0+), a project with a task of type AmazonIdentityManagementCreateRoleTask crashes with a InvalidArgumentException when imported by buildship. Tracking this down through

https://github.com/gradle/tooling-commons/blob/master/toolingmodel/src/main/java/com/gradleware/tooling/toolingmodel/repository/internal/DefaultOmniProjectTask.java

The conversion of gradle tasks to eclipse projects uses the 'path' property of tasks. (normally like ":build" ,":assemble" etc)
Since CreateRole has a property 'path' its picking that up instead, then crashing.

Running 'gradle tasks --all' with a build.gradle containing such a task you can see the "/" replacing the task name.

Like this:

task createDumbRole( type: AmazonIdentityManagementCreateRoleTask ){
  roleName "${testTempRoleName}"
  assumeRolePolicyDocument """ 
   {"Version":"2008-10-17",
     "Statement":[
       {"Effect":"Allow","Principal" : 
         {"AWS":["*"]},"Action":["sts:AssumeRole"]}]}
""".trim()
}

$ gradle tasks --all 

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

AWS tasks
---------
/ - Create Role.
deleteSessionFunction - Delete Lambda function.
invokePassthroughFunction - Invoke Lambda function.
invokeSessionFunction - Invoke Lambda function.

Which when loaded by buildship causes this non-obvious error



java.lang.IllegalArgumentException
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:77)
    at com.gradleware.tooling.toolingmodel.Path.<init>(Path.java:37)
    at com.gradleware.tooling.toolingmodel.Path.from(Path.java:81)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniProjectTask.from(DefaultOmniProjectTask.java:88)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniBuildInvocationsContainerBuilder.getAllProjectTasksByProjectPath(DefaultOmniBuildInvocationsContainerBuilder.java:104)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniBuildInvocationsContainerBuilder.build(DefaultOmniBuildInvocationsContainerBuilder.java:60)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniGradleProject.from(DefaultOmniGradleProject.java:183)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniEclipseProject.from(DefaultOmniEclipseProject.java:273)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultOmniEclipseProject.from(DefaultOmniEclipseProject.java:252)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository$10.apply(DefaultModelRepository.java:215)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository$10.apply(DefaultModelRepository.java:210)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.executeAndWait(DefaultModelRepository.java:357)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.access$100(DefaultModelRepository.java:49)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository$14.call(DefaultModelRepository.java:314)
    at com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.java:4724)
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3522)
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2315)
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3932)
    at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4721)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.getFromCache(DefaultModelRepository.java:331)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.executeRequest(DefaultModelRepository.java:310)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.executeRequest(DefaultModelRepository.java:281)
    at com.gradleware.tooling.toolingmodel.repository.internal.DefaultModelRepository.fetchEclipseGradleProjects(DefaultModelRepository.java:218)
    at org.eclipse.buildship.core.workspace.internal.DefaultModelProvider.fetchEclipseGradleProjects(DefaultModelProvider.java:66)
    at org.eclipse.buildship.core.workspace.internal.SynchronizeGradleBuildsJob.fetchEclipseProjects(SynchronizeGradleBuildsJob.java:83)
    at org.eclipse.buildship.core.workspace.internal.SynchronizeGradleBuildsJob.synchronizeBuild(SynchronizeGradleBuildsJob.java:75)
    at org.eclipse.buildship.core.workspace.internal.SynchronizeGradleBuildsJob.runToolingApiJob(SynchronizeGradleBuildsJob.java:68)
    at org.eclipse.buildship.core.util.progress.ToolingApiJob$1.run(ToolingApiJob.java:73)
    at org.eclipse.buildship.core.util.progress.ToolingApiInvoker.invoke(ToolingApiInvoker.java:62)
    at org.eclipse.buildship.core.util.progress.ToolingApiJob.run(ToolingApiJob.java:70)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)


Exception: Extension of type 'AmazonS3PluginExtension' does not exist

I'm getting this error while trying to use a SyncTask. Feels like I must be doing something silly. My build file is given below, as is the stack trace. Many thanks in advance.

Unadorned build.gradle

buildscript {
  repositories {
    mavenLocal()
   jcenter()
  }

  dependencies {
    // classpath 'com.datastax:gradle-dsa-plugin:0.1-SNAPSHOT'
    classpath "jp.classmethod.aws:gradle-aws-plugin:0.29"
  }
}

plugins {
  id 'com.datastax.gradle.curriculum.plugin' version '0.2'
}

apply plugin: 'com.datastax.gradle.curriculum.plugin'
apply plugin: 'jp.classmethod.aws'
//apply plugin: 'com.datastax.gradle.dsa.plugin'

courseResources {
  definition = file('DS420.course')
}

task bucketSync(type: jp.classmethod.aws.gradle.s3.SyncTask) {
  source project.buildDir
  bucketName = 'dsa-curriculum/DS420'
}

aws {
  profileName = file('~/.aws/credentials')
  region = 'us-west-2'
}

Interesting Part of Stacktrace

Caused by: org.gradle.api.UnknownDomainObjectException: Extension of type 'AmazonS3PluginExtension' does not exist. Currently registered extension types: [DefaultExtraPropertiesExtension, DefaultArtifactPublicationSet_Decorated, AsciidoctorExtension_Decorated, ReportingExtension_Decorated, FactoryNamedDomainObjectContainer_Decorated, AwsPluginExtension_Decorated]
        at org.gradle.api.internal.plugins.ExtensionsStorage.getHolderByType(ExtensionsStorage.java:99)
        at org.gradle.api.internal.plugins.ExtensionsStorage.getByType(ExtensionsStorage.java:77)
        at org.gradle.api.internal.plugins.DefaultConvention.getByType(DefaultConvention.java:113)
        at jp.classmethod.aws.gradle.s3.SyncTask.uploadAction(SyncTask.java:96)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:228)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:221)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:621)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:604)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        ... 68 more

And for the curious (verifying my credentials file):

~/Curriculum/curriculum/courses/DS420 (DS420 โœ˜)โœน แ… cat ~/.aws/credentials
[default]
aws_access_key_id = <REDACTED SO HARD>
aws_secret_access_key = <REDACTED SO HARD>

Misleading error message during S3 upload if overwrite is not enabled

With overwrite set to the default value of 'false', the error message in S3 Upload task complains about matching md5 check, eventhough the md5 get's never checked.
https://github.com/classmethod/gradle-aws-plugin/blob/develop/src/main/java/jp/classmethod/aws/gradle/s3/AmazonS3FileUploadTask.java#L67

Furthermore this check should be part of the 'up-to-date' check, so it is clearly visible that the upload was skipped, not hidden in the logs.

Sync Task fails with MissingMethodException

It appears that an extra (null) parameter is being passed into the putObject() method.

Caused by: groovy.lang.MissingMethodException: No signature of method: com.amazonaws.services.s3.AmazonS3Client.putObject() is applicable for argument types: (java.lang.String, java.lang.String, java.io.File, null) values: [my-bucket-name, some/bucket/prefix/path/my-file.jar, /my/local/folder/pathmy-file.jar, ...]
Possible solutions: putObject(java.lang.String, java.lang.String, java.io.File), putObject(java.lang.String, java.lang.String, java.io.InputStream, com.amazonaws.services.s3.model.ObjectMetadata), getObject(java.lang.String, java.lang.String), putObject(com.amazonaws.services.s3.model.PutObjectRequest), getObject(com.amazonaws.services.s3.model.GetObjectRequest, java.io.File)
    at jp.classmethod.aws.gradle.s3.SyncTask$_upload_closure1.doCall(SyncTask.groovy:91)
    at com.sun.proxy.$Proxy45.visitFile(Unknown Source)
    at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:157)
    at org.gradle.api.internal.file.collections.DirectoryFileTree.visitFrom(DirectoryFileTree.java:125)
    at org.gradle.api.internal.file.collections.DirectoryFileTree.visit(DirectoryFileTree.java:115)
    at org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileTreeAdapter.java:96)
    at org.gradle.api.internal.file.AbstractFileTree.visit(AbstractFileTree.java:113)
    at org.gradle.api.internal.file.CompositeFileTree.visit(CompositeFileTree.java:47)
    at org.gradle.api.file.FileTree$visit.call(Unknown Source)
    at jp.classmethod.aws.gradle.s3.SyncTask.upload(SyncTask.groovy:62)
    at jp.classmethod.aws.gradle.s3.SyncTask.this$4$upload(SyncTask.groovy)
    at jp.classmethod.aws.gradle.s3.SyncTask$this$4$upload.callCurrent(Unknown Source)
    at jp.classmethod.aws.gradle.s3.SyncTask.uploadAction(SyncTask.groovy:52)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 47 more

Support version.description for ElasticBeanstalk

The documentation indicates that there is a version.description configuration for the EB plugin. However, this does not populate the application version description. This is a good feature.

Revert a CFN stack policy to be optional in `AmazonCloudFormationMigrateStackTask`

The pull-request #83 made a security policy be mandated by either cfnStackPolicyUrl or cfnStackPolicyFile specification in the AmazonCloudFormationMigrateStackTask createStack and updateStack methods. We don't need stack policy in our project and are getting a null pointer now.

Additionally, the pull-request #81 adds redundant logging at error level:

getLogger().error("Using policy: " + selectedCapability);

I'm about to submit a pull-request to address these.

SyncTask repeats auth exception for every source file

Right now, the SyncTask spins up a new UploadTask subtask for each individual file, and schedules them all at once, up front. If the AWS credentials happen to be bad, there will be an exception generated for each file, possibly hundreds or thousands of them.

It would be nice if the SyncTask either did a pre-check on the AWS credentials, or else makes the per-file upload tasks somehow dependent on earlier ones, so that later tasks will be automatically aborted. (It would be fine to have a small number that are started simultaneously to all fail, but all subsequently started tasks should immediately and silently stop themselves.)

(I'm not sure which is the better approach, and have no experience with the AWS SDK and ExecutorService, but I'll have a look if I get time later. I just wanted to get this in, and maybe get feedback on how to proceed.)

RDS Instance Support

It would be nice to be able to create, list, and destroy RDS instances from a Gradle script.

I've written a little bit of Groovy code to do this, but it would be nice to see this capability in a Gradle plugin. (I might be willing to contribute if this feature interests you.)

Lambda now supports environment variables

Ensure the gradle plugin supports lambda environment variables

(solution is likely: update the dependent aws sdk libraries, extend the lambda function plugin to include a map of env vars)

note: we will develop a pull request for this effort

Source has to be a directory at root

The following does not work:

task syncObjects(type: jp.classmethod.aws.gradle.s3.SyncTask) {
    bucketName 'myweb.com'
    source file('src/resources/static')
}

but the following does:

task syncObjects(type: jp.classmethod.aws.gradle.s3.SyncTask) {
    bucketName 'myweb.com'
    source file('static')
}

Stacktrace:

:syncObjects FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':syncObjects'.
> source must be directory

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':syncObjects'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:62)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:155)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:152)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:33)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:100)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:94)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:94)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:83)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:77)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:47)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.GradleException: source must be directory
    at jp.classmethod.aws.gradle.s3.SyncTask.uploadAction(SyncTask.java:80)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:226)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 68 more


BUILD FAILED

Total time: 0.616 secs

Provide Metadata of Files Uploaded During S3 SyncTask

Hi,

I have a task that uses SyncTask to upload an arbitrary number of files to S3, and I need to check the ETAGs (MD5) of each file uploaded against another system. Is it possible to have the SyncTask keep track of the ObjectMetadata of each file it uploaded so that I can inspect/verify in the doLast block of my task?

Thanks,
Noel

Unable to Migrate Cloudformation Stack

I'm creating a new Cloudformation stack using this gradle plugin. I can run

./gradlew awsCfnUploadTemplate

successfully and migrate the stack from the the AWS console without issue. However when I try to use the gradle plugin to migrate the stack, I get an error:

./gradlew awsCfnMigrateStack
:awsCfnMigrateStack FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':awsCfnMigrateStack'.
> cfnTemplateUrl is not specified

Defining a cfnTemplateUrl property in the cloudformation block throws the error:

> Could not find method cfnTemplateUrl() for arguments [foo] on root project 'collections-poc'.

I can't find any reference to this property in the documentation. Please advise.

Deployment problem: Cannot change environment tier

When executing the awsEbMigrateEnvironment task on an existing environment, the plugin fails with:

`Execution failed for task '[..]:awsEbMigrateEnvironment'.

Cannot change environment tier (Service: AWSElasticBeanstalk; Status Code: 400; Error Code: InvalidParameterValue; Request ID: [..])`

That's because the tier value is always provided in the AWSElasticBeanstalkCreateEnvironmentTask task, even when it doesn't change.

Lambda: allow updating of Runtime property

I have a story where an initial lambda is set with a dummy function and later updated by a build pipeline. And the dummy function is inline node whereas the application is java.

As a builder in this scheme, I need to be able to change the runtime of the lambda function to go along with the code change.

(pull request is forthcoming)

IntelliJ Idea cannot index the repository

IntelliJ Idea cannot index the repository

http://public-maven.classmethod.info/release

It complains about not having http://public-maven.classmethod.info/release/.index/nexus-maven-repository-index.properties on the webserver.

More logs:

2015-07-23 15:27:30,598 [  31759]   WARN -      #org.jetbrains.idea.maven - Failed to update Maven indices for: [com.intellij.util.CachedValueImpl@51ecb8a1] http://public-maven.classmethod.info/release
org.jetbrains.idea.maven.server.MavenServerIndexerException: java.lang.RuntimeException: java.io.FileNotFoundException: Resource nexus-maven-repository-index.properties does not exist
    at org.jetbrains.idea.maven.server.Maven3ServerIndexerImpl.updateIndex(Maven3ServerIndexerImpl.java:221)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
    at com.sun.proxy.$Proxy110.updateIndex(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.execution.rmi.RemoteUtil.invokeRemote(RemoteUtil.java:124)
    at com.intellij.execution.rmi.RemoteUtil.access$100(RemoteUtil.java:36)
    at com.intellij.execution.rmi.RemoteUtil$2$1$1.compute(RemoteUtil.java:105)
    at com.intellij.execution.rmi.RemoteUtil.executeWithClassLoader(RemoteUtil.java:181)
    at com.intellij.execution.rmi.RemoteUtil$2$1.invoke(RemoteUtil.java:102)
    at com.sun.proxy.$Proxy110.updateIndex(Unknown Source)
    at org.jetbrains.idea.maven.server.MavenIndexerWrapper$3.execute(MavenIndexerWrapper.java:120)
    at org.jetbrains.idea.maven.server.RemoteObjectWrapper.perform(RemoteObjectWrapper.java:118)
    at org.jetbrains.idea.maven.server.MavenIndexerWrapper.updateIndex(MavenIndexerWrapper.java:115)
    at org.jetbrains.idea.maven.indices.MavenIndex.updateContext(MavenIndex.java:377)
    at org.jetbrains.idea.maven.indices.MavenIndex.updateOrRepair(MavenIndex.java:335)
    at org.jetbrains.idea.maven.indices.MavenIndices.updateOrRepair(MavenIndices.java:141)
    at org.jetbrains.idea.maven.indices.MavenIndicesManager.doUpdateIndices(MavenIndicesManager.java:260)
    at org.jetbrains.idea.maven.indices.MavenIndicesManager.access$200(MavenIndicesManager.java:49)
    at org.jetbrains.idea.maven.indices.MavenIndicesManager$3.run(MavenIndicesManager.java:231)
    at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:563)
    at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:152)
    at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:452)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:402)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:137)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl$1.run(ProgressManagerImpl.java:126)
    at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:400)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
    at org.jetbrains.ide.PooledThreadExecutor$1$1.run(PooledThreadExecutor.java:56)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.io.FileNotFoundException: Resource nexus-maven-repository-index.properties does not exist
    at org.jetbrains.idea.maven.server.Maven3ServerIndexerImpl$2.run(Maven3ServerIndexerImpl.java:204)
    at org.jetbrains.idea.maven.server.Maven30ServerEmbedderImpl.executeWithMavenSession(Maven30ServerEmbedderImpl.java:377)
    at org.jetbrains.idea.maven.server.Maven3ServerIndexerImpl.updateIndex(Maven3ServerIndexerImpl.java:170)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: Resource nexus-maven-repository-index.properties does not exist
    at org.jetbrains.idea.maven.server.Maven3ServerIndexFetcher.retrieve(Maven3ServerIndexFetcher.java:108)
    at org.sonatype.nexus.index.updater.AbstractResourceFetcher.retrieve(AbstractResourceFetcher.java:22)
    at org.sonatype.nexus.index.updater.DefaultIndexUpdater.downloadIndexProperties(DefaultIndexUpdater.java:484)
    at org.sonatype.nexus.index.updater.DefaultIndexUpdater.access$100(DefaultIndexUpdater.java:65)
    at org.sonatype.nexus.index.updater.DefaultIndexUpdater$IndexAdaptor.setProperties(DefaultIndexUpdater.java:771)
    at org.sonatype.nexus.index.updater.DefaultIndexUpdater.fetchAndUpdateIndex(DefaultIndexUpdater.java:945)
    at org.sonatype.nexus.index.updater.DefaultIndexUpdater.fetchAndUpdateIndex(DefaultIndexUpdater.java:150)
    at org.jetbrains.idea.maven.server.Maven3ServerIndexerImpl$2.run(Maven3ServerIndexerImpl.java:201)
    ... 16 more
Caused by: java.lang.RuntimeException: org.apache.maven.wagon.ResourceDoesNotExistException: File: http://public-maven.classmethod.info/release/.index/nexus-maven-repository-index.properties , ReasonPhrase:Not Found.
    at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:1029)
    at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:977)
    at org.apache.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:116)
    at org.apache.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88)
    at org.apache.maven.wagon.StreamWagon.get(StreamWagon.java:61)
    at org.jetbrains.idea.maven.server.Maven3ServerIndexFetcher.retrieve(Maven3ServerIndexFetcher.java:100)

Feature request # vpc support

Lambda support to access vpc resources. The function migration needs extra parameters like subnet ids, vpc info etc. to support this feature. Can you please add.

API GW support

Hello,
I can understand that development of this awesome plugin goes slow because of lack of resources, so this issue will be here just as a placeholder for feature request.
API GW sources are here
So one can easily add its support to gradle-aws-plugin.
Personally I am interested in this feature, but not that critically to implement it during my work time (as it was with vpc support), as we only have couple of lambdas and can configure them through web and cli. But in general it would be nice to have both lambda deploy and api gw conf in single gradle config to be executed during continuous delivery. API GW is especially interesting in response code matching part, as this currently is configured in very weird manner.

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.