Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions aws-sdk-v2/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ dependencies {
compileOnly libs.awssdk.apigatewaymanagementapi
compileOnly libs.awssdk.s3
compileOnly libs.awssdk.dynamodb
compileOnly libs.awssdk.lambda
compileOnly libs.awssdk.ses
compileOnly libs.awssdk.sns
compileOnly libs.awssdk.sqs
Expand All @@ -33,6 +34,7 @@ dependencies {
testImplementation libs.awssdk.apache.client
testImplementation libs.awssdk.s3
testImplementation libs.awssdk.dynamodb
testImplementation libs.awssdk.lambda
testImplementation libs.awssdk.ses
testImplementation libs.awssdk.secretsmanager
testImplementation libs.awssdk.sns
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
* Copyright 2017-2022 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.aws.sdk.v2.service.lambda;

import io.micronaut.aws.sdk.v2.service.AwsClientFactory;
import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Requires;
import jakarta.inject.Singleton;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.regions.providers.AwsRegionProviderChain;
import software.amazon.awssdk.services.lambda.*;

/**
* Factory that creates a Lambda client.
*
* @since 3.8.0
*/
@Factory
public class LambdaClientFactory extends AwsClientFactory<LambdaClientBuilder, LambdaAsyncClientBuilder, LambdaClient, LambdaAsyncClient> {

private final LambdaConfigurationProperties configuration;

/**
* Constructor.
*
* @param credentialsProvider The credentials provider
* @param regionProvider The region provider
* @param configuration Additional configuration
*/
protected LambdaClientFactory(AwsCredentialsProviderChain credentialsProvider, AwsRegionProviderChain regionProvider,
LambdaConfigurationProperties configuration) {
super(credentialsProvider, regionProvider);
this.configuration = configuration;
}

@Override
protected LambdaClientBuilder createSyncBuilder() {
return configureBuilder(LambdaClient.builder());
}

@Override
protected LambdaAsyncClientBuilder createAsyncBuilder() {
return configureBuilder(LambdaAsyncClient.builder());
}

private <T extends LambdaBaseClientBuilder<?, ?>> T configureBuilder(T builder) {
if (configuration.getEndpointOverride() != null) {
builder.endpointOverride(configuration.getEndpointOverride());
}
if (!configuration.getMetricsPublishers().isEmpty()) {
ClientOverrideConfiguration.Builder overrideCfgBuilder = ClientOverrideConfiguration.builder();
overrideCfgBuilder.metricPublishers(configuration.getMetricsPublishers());
builder.overrideConfiguration(overrideCfgBuilder.build());
}
return builder;
}

@Override
@Singleton
public LambdaClientBuilder syncBuilder(SdkHttpClient httpClient) {
return super.syncBuilder(httpClient);
}

@Override
@Bean(preDestroy = "close")
@Singleton
public LambdaClient syncClient(LambdaClientBuilder builder) {
return super.syncClient(builder);
}

@Override
@Singleton
@Requires(beans = SdkAsyncHttpClient.class)
public LambdaAsyncClientBuilder asyncBuilder(SdkAsyncHttpClient httpClient) {
return super.asyncBuilder(httpClient);
}

@Override
@Bean(preDestroy = "close")
@Singleton
@Requires(beans = SdkAsyncHttpClient.class)
public LambdaAsyncClient asyncClient(LambdaAsyncClientBuilder builder) {
return super.asyncClient(builder);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* Copyright 2017-2020 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.aws.sdk.v2.service.lambda;

import io.micronaut.aws.AWSConfiguration;
import io.micronaut.context.annotation.ConfigurationProperties;
import io.micronaut.core.annotation.Nullable;
import jakarta.inject.Inject;
import software.amazon.awssdk.metrics.MetricPublisher;
import software.amazon.awssdk.services.lambda.LambdaClient;

import java.net.URI;
import java.util.Collections;
import java.util.List;

/**
* Configuration properties for Lambda.
*
* @since 3.8.0
*/
@ConfigurationProperties(LambdaClient.SERVICE_NAME)
public class LambdaConfigurationProperties extends AWSConfiguration {

@Nullable
private URI endpointOverride;

private List<MetricPublisher> metricsPublishers = Collections.emptyList();

/**
* The metric publishers
*
* @return list of configured metric publishers
*/
public List<MetricPublisher> getMetricsPublishers() {
return metricsPublishers;
}

/**
* @param metricsPublishers The {@link MetricPublisher}s
*/
@Inject
public void setMetricsPublishers(List<MetricPublisher> metricsPublishers) {
this.metricsPublishers = metricsPublishers;
}

/**
* @return The endpoint with which the AWS SDK should communicate
*/
@Nullable
public URI getEndpointOverride() {
return endpointOverride;
}

/**
* Provide a URI to override the endpoint with which the AWS SDK should communicate. Optional. Defaults to `null`.
*
* @param endpointOverride The endpoint with which the AWS SDK should communicate
*/
public void setEndpointOverride(@Nullable URI endpointOverride) {
this.endpointOverride = endpointOverride;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright 2017-2022 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Lambda client factory.
*
* @since 3.8.0
*/
@Requires(classes = {LambdaClient.class, LambdaAsyncClient.class})
@Configuration
package io.micronaut.aws.sdk.v2.service.lambda;

import io.micronaut.context.annotation.Configuration;
import io.micronaut.context.annotation.Requires;
import software.amazon.awssdk.services.lambda.LambdaAsyncClient;
import software.amazon.awssdk.services.lambda.LambdaClient;
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
# limitations under the License.
#

Args = --initialize-at-run-time=io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$SyncClient1$Definition
Args = --initialize-at-run-time=io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.servicediscovery.$ServiceDiscoveryAsyncClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$Definition,io.micronaut.aws.sdk.v2.service.sns.$SnsClientFactory$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ses.$SesClientFactory$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.ssm.$SsmClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.dynamodb.$DynamoDbClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.secretsmanager.$SecretsManagerClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.sqs.$SqsClientFactory$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.s3.$S3ClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.gatewaymanagement.$ApiGatewayManagementApiClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$AsyncBuilder2$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$AsyncClient3$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$SyncBuilder0$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$SyncClient1$Definition,io.micronaut.aws.sdk.v2.service.lambda.$LambdaClientFactory$AsyncBuilder2$Definition
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.micronaut.aws.sdk.v2.service

import io.micronaut.aws.sdk.v2.ApplicationContextSpecification
import software.amazon.awssdk.core.client.config.SdkClientOption
import software.amazon.awssdk.services.lambda.LambdaAsyncClient
import software.amazon.awssdk.services.lambda.LambdaClient
import software.amazon.awssdk.services.lambda.LambdaClientBuilder

class LambdaClientSpec extends ApplicationContextSpecification {

private static final String ENDPOINT = "https://localhost:1234"

@Override
Map<String, Object> getConfiguration() {
super.configuration + [
"aws.lambda.endpoint-override": ENDPOINT
]
}

void "it can configure a sync client"() {
when:
LambdaClient client = applicationContext.getBean(LambdaClient)

then:
client.serviceName() == LambdaClient.SERVICE_NAME
}

void "it can configure an async client"() {
when:
LambdaAsyncClient client = applicationContext.getBean(LambdaAsyncClient)

then:
client.serviceName() == LambdaAsyncClient.SERVICE_NAME
}

void "it can override endpoint"() {
when:
LambdaClientBuilder builder = applicationContext.getBean(LambdaClientBuilder)

then:
builder.syncClientConfiguration().option(SdkClientOption.ENDPOINT).toString() == ENDPOINT
}
}
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ plugins {
id "io.micronaut.build.internal.dependency-updates"
id "io.micronaut.build.internal.quality-reporting"
}

javadoc {
options.encoding = 'UTF-8'
}
23 changes: 23 additions & 0 deletions function-client-aws-v2/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
plugins {
id("io.micronaut.build.internal.module")
}

dependencies {
api project(":aws-sdk-v2")
implementation libs.projectreactor
implementation libs.awssdk.lambda
api libs.micronaut.function.client

testAnnotationProcessor libs.micronaut.inject.java
testImplementation libs.micronaut.inject.java
testImplementation libs.micronaut.http.server.netty
testImplementation libs.micronaut.function.web
testImplementation libs.micronaut.function.groovy
testImplementation libs.micronaut.runtime.groovy
}

micronautBuild {
binaryCompatibility {
enabled = false
}
}
Loading