Skip to content
This repository was archived by the owner on Feb 23, 2023. It is now read-only.

chore: move examples of using parameters for Java Powertools #30

Merged
merged 1 commit into from
Mar 1, 2022
Merged
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
92 changes: 92 additions & 0 deletions java/Parameters/Function/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>Functions</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>Sample app demoing parameters utility of Powertools.</name>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<log4j.version>2.17.1</log4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-logging</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-parameters</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>3.11.0</version>
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- JUnit 5 requires Surefire version 2.22.0 or higher -->
<version>2.22.0</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.14.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<complianceLevel>${maven.compiler.target}</complianceLevel>
<aspectLibraries>
<aspectLibrary>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-parameters</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -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 + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -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<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
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<String, String> allValues = ssmProvider.getMultiple("/powertools-java/sample");
String b64value = ssmProvider.withTransformation(base64).get("/powertools-java/sample/keybase64");

Map<String, String> 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<String, String> 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()));
}
}
}
16 changes: 16 additions & 0 deletions java/Parameters/Function/src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
<Appenders>
<Console name="JsonAppender" target="SYSTEM_OUT">
<LambdaJsonLayout compact="true" eventEol="true"/>
</Console>
</Appenders>
<Loggers>
<Logger name="JsonLogger" level="INFO" additivity="false">
<AppenderRef ref="JsonAppender"/>
</Logger>
<Root level="info">
<AppenderRef ref="JsonAppender"/>
</Root>
</Loggers>
</Configuration>
21 changes: 21 additions & 0 deletions java/Parameters/README.md
Original file line number Diff line number Diff line change
@@ -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
```
97 changes: 97 additions & 0 deletions java/Parameters/template.yaml
Original file line number Diff line number Diff line change
@@ -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
7 changes: 7 additions & 0 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
]
}