localstack을 활용하여 local에서 s3 접근하기 예제

TreeSick·2022년 6월 10일
0

테스트코드

목록 보기
2/2

저번 예제에서는 localstack을 단순히 테스트코드에서만 활용하여 s3에 업로드하는 테스트를 해보았습니다.

하지만, 복잡한 로직을 local에서 실행해보았을 때, 항상 aws s3에 접근하는 것은 어렵습니다.

그래서, 이번엔 localstack을 아예 로직내에 포함시켜서

local에서 프로젝트를 실행했을 때, localstack의 s3로 연동이 되도록 해보겠습니다.

S3 업로드 프로젝트

저번 연습예제였던 S3 연동 프로젝트를 기반으로 약간의 수정을 했으니 꼭 봐주시기 바랍니다.

https://velog.io/@rainbowweb/AWS-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-S3

소스코드

https://github.com/namusik/TIL-SampleProject/tree/main/TestCode/LoaclStack/LocalStack%20%EC%98%88%EC%A0%9C

작업환경

IntelliJ
Spring Boot
java 11
gradle

build.gradle

dependencies {
    //localstack
    implementation "org.testcontainers:localstack:1.16.3"
    //s3
    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
}

각각 localstack, aws cloud 의존성을 추가해줍니다.

localstack은 테스트코드에 사용하던 것과 다르게 testimplementaion이 아닌 implementation으로 추가해줍니다.

LocalStackS3Config

@Configuration
public class LocalStackS3Config {

    private static final DockerImageName LOCAL_STACK_IMAGE = DockerImageName.parse("localstack/localstack");

    @Bean(initMethod = "start", destroyMethod = "stop")
    public LocalStackContainer localStackContainer() {
        return new LocalStackContainer(LOCAL_STACK_IMAGE)
                .withServices(LocalStackContainer.Service.S3);
    }

    @Bean
    public AmazonS3 amazonS3(LocalStackContainer localStackContainer) {
        AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(localStackContainer.getEndpointConfiguration(S3))
                .withCredentials(localStackContainer.getDefaultCredentialsProvider())
                .build();

        amazonS3.createBucket("woo");
        return amazonS3;
    }
}

S3 프로젝트와 전부 동일하고 S3Amazon 객체를 만들어주는 Config 부분에만 차이가 있습니다.

private static final DockerImageName LOCALSTACK_NAME = DockerImageName.parse("localstack/localstack");

도커에서 localstack/localstack 이미지를 가져옵니다.

@Bean(initMethod = "start", destroyMethod = "stop")
public LocalStackContainer localStackContainer() {
return new LocalStackContainer(LOCAL_STACK_IMAGE)
.withServices(LocalStackContainer.Service.S3);
}

가져온 이미지명과 사용하려는 AWS 서비스 (여기선 s3)를 가지고 localstackcontainer를 도커에 만들어 줍니다.

이 과정까지 진행되면 현재 도커에 컨테이너가 돌아가게 됩니다.

여기서 LocalStackContainer의 부모 클래스인 GenericContainer가 docker 컨테이너를 실행하는 start()메서드와 해당 컨테이너를 중지시키는 stop() 메서드를 기준으로 localstack 컨테이너 빈 생명 주기를 설정해줍니다.

이 다음으로 AmazonS3 객체를 만들어 줍니다.

.withCredentials(localStackContainer.getDefaultCredentialsProvider())

여기서 별도의 aws 시크릿키가 없기 때문에, localstack의 defaultcredential을 사용해줍니다.

amazonS3.createBucket(bucketName);

그리고 각자 원하시는 버킷이름을 지정하여 버킷을 만들어 준후 amzons3객체를 리턴해줍니다.

도커 생성 결과

테스트 도중 도커를 확인해보면, testcontainer와 localstack 컨테이너가 만들어 진것이 확인 가능합니다.

여기서 localstack 컨테이너로 들어가 명령어를 통해 object를 조회해보면

만들어준 bucket과 업로드한 object를 볼 수 있다.

참고

https://loosie.tistory.com/817

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-listing-buckets

profile
깃헙에 올린 예제 코드의 설명을 적어놓는 블로그

0개의 댓글