From bdc6106f66eb811e1c42c6b808ae04082f1d8e87 Mon Sep 17 00:00:00 2001 From: Grzegorz Kozub Date: Fri, 25 Feb 2022 17:01:48 +0100 Subject: [PATCH] chore: move examples of using parameters for Java Powertools --- java/Parameters/Function/pom.xml | 92 ++++++++++++++++++ .../java/org/demo/parameters/MyObject.java | 34 +++++++ .../demo/parameters/ParametersFunction.java | 81 ++++++++++++++++ .../Function/src/main/resources/log4j2.xml | 16 +++ java/Parameters/README.md | 21 ++++ java/Parameters/template.yaml | 97 +++++++++++++++++++ manifest.json | 7 ++ 7 files changed, 348 insertions(+) create mode 100644 java/Parameters/Function/pom.xml create mode 100644 java/Parameters/Function/src/main/java/org/demo/parameters/MyObject.java create mode 100644 java/Parameters/Function/src/main/java/org/demo/parameters/ParametersFunction.java create mode 100644 java/Parameters/Function/src/main/resources/log4j2.xml create mode 100644 java/Parameters/README.md create mode 100644 java/Parameters/template.yaml diff --git a/java/Parameters/Function/pom.xml b/java/Parameters/Function/pom.xml new file mode 100644 index 0000000..f8e9704 --- /dev/null +++ b/java/Parameters/Function/pom.xml @@ -0,0 +1,92 @@ + + 4.0.0 + demo + Functions + 1.0 + jar + Sample app demoing parameters utility of Powertools. + + 11 + 11 + 2.17.1 + UTF-8 + + + + + software.amazon.lambda + powertools-logging + 1.11.0 + + + software.amazon.lambda + powertools-parameters + 1.11.0 + + + com.amazonaws + aws-lambda-java-core + 1.2.1 + + + com.amazonaws + aws-lambda-java-events + 3.11.0 + + + + + org.mockito + mockito-core + 4.3.1 + test + + + org.junit.jupiter + junit-jupiter-api + 5.8.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.8.2 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 2.22.0 + + + org.codehaus.mojo + aspectj-maven-plugin + 1.14.0 + + ${maven.compiler.source} + ${maven.compiler.target} + ${maven.compiler.target} + + + software.amazon.lambda + powertools-parameters + + + + + + + compile + + + + + + + diff --git a/java/Parameters/Function/src/main/java/org/demo/parameters/MyObject.java b/java/Parameters/Function/src/main/java/org/demo/parameters/MyObject.java new file mode 100644 index 0000000..2cf1452 --- /dev/null +++ b/java/Parameters/Function/src/main/java/org/demo/parameters/MyObject.java @@ -0,0 +1,34 @@ +package org.demo.parameters; + +public class MyObject { + + private long id; + private String code; + + public MyObject() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + @Override + public String toString() { + return "MyObject{" + + "id=" + id + + ", code='" + code + '\'' + + '}'; + } +} diff --git a/java/Parameters/Function/src/main/java/org/demo/parameters/ParametersFunction.java b/java/Parameters/Function/src/main/java/org/demo/parameters/ParametersFunction.java new file mode 100644 index 0000000..f5d98a4 --- /dev/null +++ b/java/Parameters/Function/src/main/java/org/demo/parameters/ParametersFunction.java @@ -0,0 +1,81 @@ +package org.demo.parameters; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import software.amazon.lambda.powertools.parameters.ParamManager; +import software.amazon.lambda.powertools.parameters.SSMProvider; +import software.amazon.lambda.powertools.parameters.SecretsProvider; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.time.temporal.ChronoUnit.SECONDS; +import static software.amazon.lambda.powertools.parameters.transform.Transformer.base64; +import static software.amazon.lambda.powertools.parameters.transform.Transformer.json; + +public class ParametersFunction implements RequestHandler { + private final static Logger log = LogManager.getLogger(); + + SSMProvider ssmProvider = ParamManager.getSsmProvider(); + SecretsProvider secretsProvider = ParamManager.getSecretsProvider(); + + String simpleValue = ssmProvider.defaultMaxAge(30, SECONDS).get("/powertools-java/sample/simplekey"); + String listValue = ssmProvider.withMaxAge(60, SECONDS).get("/powertools-java/sample/keylist"); + MyObject jsonObj = ssmProvider.withTransformation(json).get("/powertools-java/sample/keyjson", MyObject.class); + Map allValues = ssmProvider.getMultiple("/powertools-java/sample"); + String b64value = ssmProvider.withTransformation(base64).get("/powertools-java/sample/keybase64"); + + Map secretJson = secretsProvider.withTransformation(json).get("/powertools-java/userpwd", Map.class); + MyObject secretJsonObj = secretsProvider.withMaxAge(42, SECONDS).withTransformation(json).get("/powertools-java/secretcode", MyObject.class); + + @Override + public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { + + log.info("\n=============== SSM Parameter Store ==============="); + log.info("simplevalue={}, listvalue={}, b64value={}\n", simpleValue, listValue, b64value); + log.info("jsonobj={}\n", jsonObj); + + log.info("allvalues (multiple):"); + allValues.forEach((key, value) -> log.info("- {}={}\n", key, value)); + + log.info("\n=============== Secrets Manager ==============="); + log.info("secretjson:"); + secretJson.forEach((key, value) -> log.info("- {}={}\n", key, value)); + log.info("secretjsonobj={}\n", secretJsonObj); + + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + headers.put("X-Custom-Header", "application/json"); + + APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent() + .withHeaders(headers); + try { + final String pageContents = this.getPageContents("https://checkip.amazonaws.com"); + String output = String.format("{ \"message\": \"hello world\", \"location\": \"%s\" }", pageContents); + + return response + .withStatusCode(200) + .withBody(output); + } catch (IOException e) { + return response + .withBody("{}") + .withStatusCode(500); + } + } + + private String getPageContents(String address) throws IOException{ + URL url = new URL(address); + try(BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) { + return br.lines().collect(Collectors.joining(System.lineSeparator())); + } + } +} diff --git a/java/Parameters/Function/src/main/resources/log4j2.xml b/java/Parameters/Function/src/main/resources/log4j2.xml new file mode 100644 index 0000000..033da8a --- /dev/null +++ b/java/Parameters/Function/src/main/resources/log4j2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/Parameters/README.md b/java/Parameters/README.md new file mode 100644 index 0000000..c03f407 --- /dev/null +++ b/java/Parameters/README.md @@ -0,0 +1,21 @@ +# Parameters + +This project contains an example of Lambda function using the parameters module of Lambda Powertools for Java. For more information on this module, please refer to the [documentation](https://awslabs.github.io/aws-lambda-powertools-java/utilities/parameters/). + +## Deploy the sample application + +This sample is based on Serverless Application Model (SAM) and you can use the SAM Command Line Interface (SAM CLI) to build it and deploy it to AWS. + +To use the SAM CLI, you need the following tools. + +* SAM CLI - [Install the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) +* Java11 - [Install the Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html) +* Maven - [Install Maven](https://maven.apache.org/install.html) +* Docker - [Install Docker community edition](https://hub.docker.com/search/?type=edition&offering=community) + +To build and deploy your application for the first time, run the following in your shell: + +```bash +sam build +sam deploy --guided +``` diff --git a/java/Parameters/template.yaml b/java/Parameters/template.yaml new file mode 100644 index 0000000..d9038d3 --- /dev/null +++ b/java/Parameters/template.yaml @@ -0,0 +1,97 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: > + validation demo + +Globals: + Function: + Timeout: 20 + Runtime: java11 + MemorySize: 512 + Tracing: Active + + +Resources: + ParametersFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: Function + Handler: org.demo.parameters.ParametersFunction::handleRequest + MemorySize: 512 + Tracing: Active + Policies: + - AWSSecretsManagerGetSecretValuePolicy: + SecretArn: !Ref UserPwd + - AWSSecretsManagerGetSecretValuePolicy: + SecretArn: !Ref SecretConfig + - Statement: + - Sid: SSMGetParameterPolicy + Effect: Allow + Action: + - ssm:GetParameter + - ssm:GetParameters + - ssm:GetParametersByPath + Resource: '*' + Events: + HelloWorld: + Type: Api + Properties: + Path: /params + Method: get + + UserPwd: + Type: AWS::SecretsManager::Secret + Properties: + Name: /powertools-java/userpwd + Description: Generated secret for lambda-powertools-java powertools-parameters + module + GenerateSecretString: + SecretStringTemplate: '{"username": "test-user"}' + GenerateStringKey: password + PasswordLength: 15 + ExcludeCharacters: '"@/\' + SecretConfig: + Type: AWS::SecretsManager::Secret + Properties: + Name: /powertools-java/secretcode + Description: Json secret for lambda-powertools-java powertools-parameters module + SecretString: '{"id":23443,"code":"hk38543oj24kn796kp67bkb234gkj679l68"}' + BasicParameter: + Type: AWS::SSM::Parameter + Properties: + Name: /powertools-java/sample/simplekey + Type: String + Value: simplevalue + Description: Simple SSM Parameter for lambda-powertools-java powertools-parameters + module + ParameterList: + Type: AWS::SSM::Parameter + Properties: + Name: /powertools-java/sample/keylist + Type: StringList + Value: value1,value2,value3 + Description: SSM Parameter List for lambda-powertools-java powertools-parameters + module + JsonParameter: + Type: AWS::SSM::Parameter + Properties: + Name: /powertools-java/sample/keyjson + Type: String + Value: '{"id":23443,"code":"hk38543oj24kn796kp67bkb234gkj679l68"}' + Description: Json SSM Parameter for lambda-powertools-java powertools-parameters + module + Base64Parameter: + Type: AWS::SSM::Parameter + Properties: + Name: /powertools-java/sample/keybase64 + Type: String + Value: aGVsbG8gd29ybGQ= + Description: Base64 SSM Parameter for lambda-powertools-java powertools-parameters module + +Outputs: + ParametersApi: + Description: "API Gateway endpoint URL for Prod stage for Parameters function" + Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/params/" + ParametersFunction: + Description: "Parameters Lambda Function ARN" + Value: !GetAtt ParametersFunction.Arn \ No newline at end of file diff --git a/manifest.json b/manifest.json index a3106d9..1229d00 100644 --- a/manifest.json +++ b/manifest.json @@ -27,6 +27,13 @@ "dependencyManager": "maven", "appTemplate": "Validation", "javaVersion": "11" + }, + { + "directory": "java/Parameters/Function", + "displayName": "Demos setup of an parameters Lambda function using Powertools", + "dependencyManager": "maven", + "appTemplate": "Parameters", + "javaVersion": "11" } ] } \ No newline at end of file