Spring BootからLocalstack内のSQSにアクセスする
はじめに
Localstackをベースに開発環境を整える際にSQSへのアクセスを
Javaからできないかを模索したのでコードの説明と貼り付け
とりあえず、動かすことを目的としたのでUnittestにて試験結果を確認できるようにしてみました。
Localstackの構築手順は以下を参考にしてください
Localstackの環境構築と基本的なアクセス方法
ソースコード
credentialsファイルの準備
vi ~/.aws/credentials ============== [localstack] aws_access_key_id=dummy aws_secret_access_key=dummy region=ap-northeast-1 ==============
Javaのコード
src/main/java/net/keydrop/service/SqsService.javapackage net.keydrop.service; import java.net.URI; import org.springframework.stereotype.Service; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sqs.SqsClient; import software.amazon.awssdk.services.sqs.model.SqsException; import software.amazon.awssdk.services.sqs.paginators.ListQueuesIterable; @Service public class SqsService { /** clientのインスタンス. */ private static SqsClient client = null; /** * インスタンスのSQSのclient生成。 * @return */ public static SqsClient getClientInstance() { if (client != null) return client; client = SqsClient.builder() .region(Region.AP_NORTHEAST_1) .credentialsProvider(ProfileCredentialsProvider.create("localstack")) .endpointOverride(URI.create("http://localhost:4566")) .build(); return client; } /*** * キューのリストを取得. */ public void listQueues() { SqsClient sqsClient = getClientInstance(); try { ListQueuesIterable listQueues = sqsClient.listQueuesPaginator(); listQueues.stream() .flatMap(r -> r.queueUrls().stream()) .forEach(content -> System.out.println(" Queue URL: " + content.toLowerCase())); sqsClient.close(); } catch (SqsException e) { System.err.println(e.awsErrorDetails().errorMessage()); e.printStackTrace(); } } }
src/test/java/net/keydrop/service/SqsServiceTest.java
package net.keydrop.service; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class SqsServiceTest { private SqsService sqsService; @BeforeEach public void setUp() { SqsService.getClientInstance(); sqsService = new SqsService(); } @Test public void sqsListTest() { sqsService.listQueues(); assertEquals(1, 1); } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>net.keydrop</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.21.17</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
説明
1. ポイントとしては通常のAWSにアクセスするのではなくlocal側にアクセスが必要な点です。
localstackのアクセス先をチェックしてURIのcreate部分は自環境で調整が必要です。
2. pom.xml側にもAWSの最新のライブラリを使うとエラーが発生し「2.21.17」の固定にしています。
https://github.com/localstack/localstack/issues/9054のサイトにバージョンを上げたら
問題が出たと書いてあったのでそれを参考にしました。