====== LocalStack ====== * https://github.com/localstack/localstack * https://hub.docker.com/r/localstack/localstack/ * [[https://github.com/localstack/localstack/tree/master/doc/developer_guides|Localstack Developer Guide]] * [[:aws|AWS]]의 대부분의 기능을 로컬 환경에서 에뮬레이션 한다. Local 개발환경에서 AWS 연동 기능을 개발할 때 사용할 수 있다. * Python 기반이지만 [[:docker|Docker]]로 모든 서버를 띄울 수 있다. * Unit Test 시에 JUnit 4/5 를 모두 지원하여 자동으로 컨테이너를 띄웠다 내려줄 수 있다. * [[aws:java_sdk|AWS Java SDK]] * [[aws:goaws|goaws]] ===== Port ===== * ''0.11'' 버전부터 ''4566'' 포트로 모든 서비스에 접근 가능하다. * ''EDGE_PORT'' 환경변수값으로 조정 가능하다. ===== docker-compose ===== * [[docker:docker_compose|docker-compose]] version: "3" services: localstack: image: localstack/localstack:0.12.6 # 혹시나 자동 버전업으로 인한 오류를 막기위해 tag 명시 container_name: localstack ports: - "4566:4566" environment: - SERVICES=sns,sqs,s3 - USE_SINGLE_REGION=1 - DEFAULT_REGION=ap-northeast-2 - HOSTNAME=localhost - HOSTNAME_EXTERNAL=loaclhost - DATA_DIR=/tmp/localstack/data - DOCKER_HOST=unix:///var/run/docker.sock volumes: - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" # localstack 이 생성하는 파일을 직접 편집하고 싶을 때 - "./localstack-init.d:/docker-entrypoint-initaws.d" - "/var/run/docker.sock:/var/run/docker.sock" * ''localstack-init.'' 디렉토리에 ''*.sh'' 파일을 둔다. 이 파일은 정렬 순서대로 실행되므로 ''00-init.sh'', ''01-create-xxx.sh'' 형태 등으로 만드는 것이 좋다. * 해당 파일 안에서 ''awslocal'' 명령으로 ''aws'' 명령을 실행하면 된다. * 본인 PC의 ''/tmp'' 혹은 ''/tmp/localstack'' 에 localstack 의 데이터가 저장된다. * SQS 에 메시지가 쌓일 경우 뜨는 속도가 매우 느려진다 ''/tmp/localstack/data'' 에 있는 SQS 데이터를 지워준다. sleep 30 # awslocal 호출 --endpoint-url=http://localstack:4566 생략 가능 # localstack 은 docker-compose service 이름인데, 여기에 밑줄이 있으면 네트워크 접속이 안됐음. # regtion 은 DEFAULT_REGION=ap-northeast-2 으로 자동 지정됨. echo "## creating topics" awslocal sns create-topic --name my-sns echo "## creating queues" awslocal sqs create-queue --queue-name my-sqs awslocal sns subscribe --topic-arn arn:aws:sns:ap-northeast-2:000000000000:my-sns \ --protocol sqs --notification-endpoint http://localstack:4566/queue/my-sqs \ ===== Mac OS ===== TMPDIR=/private$TMPDIR docker-compose up ===== localstack-full ===== * [[https://hub.docker.com/r/localstack/localstack-full|localstack/localstack-full]] * ElasticSearch 등 잘 안쓰는 기능을 추가한 버전 * WEB UI는 기존에는 ''localstack-full''에서 지원했으나 deprecated 상태였고 최근 버전에서는 아예 지원을 안 하는 것으로 보임. ===== arn ===== * localstack 의 ARN 은 ''arn:aws:sns:[region]:000000000000'' 형태이다. ===== localstack 실행 후 초기화 ===== * ''docker-entrypoint-initaws.d/'' volume 에 ''*.sh'' 파일들을 만들고, ''awslocal'' 명령으로 스크립트를 실행하면 된다. * docker-compose 의 서비스 이름에 밑줄(''_'') 이 들어있을 경우 올바로 네트워크 접속이 안됐음. * 이후 ''awslocal'' 명령 실행을 위해 shell 진입 # localstack 은 컨테이너 이름. docker exec -it localstack /bin/bash # 명령실행 awslocal ... ===== awslocal ===== * [[https://github.com/localstack/awscli-local|localstack/awscli-local: 💲 "awslocal" - Thin wrapper around the "aws" command line interface for use with LocalStack]] # user 계정 영역에 설치 pip install --user awscli-local * 설치 없이 [[linux:alias|Linux Alias]] 만으로도 가능하다. alias awslocal="AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=${DEFAULT_REGION:-$AWS_DEFAULT_REGION} aws --endpoint-url=http://${LOCALSTACK_HOST:-localhost}:${LOCALSTACK_PORT:-4566}" # 환경변수 DEFAULT_REGION, LOCALSTACK_HOST, LOCALSTACK_PORT 를 지정한다. ===== Java SDK 설정 ===== * [[aws:java_sdk|AWS Java SDK]]와 localstack 설정 * credential 은 아무거나 해도 된다. AWSStaticCredentialsProvider localstackCrendentialProvider = new AWSStaticCredentialsProvider(new BasicAWSCredentials("anykey", "anysecret")); AwsClientBuilder.EndpointConfiguration localstackEndpointConfiguration = new AwsClientBuilder.EndpointConfiguration("http://localhost:4566", Regions.AP_NORTHEAST_2.name()); AmazonSNS amazonSNS = AmazonSNSClient .standard() .withEndpointConfiguration(localstackEndpointConfiguration) .withCredentials(localstackCrendentialProvider) .build(); ==== S3 ==== * Java SDK 에서 localstack S3 설정은 **''.withPathStyleAccessEnabled(true)''**가 있어야 한다. 안그러면 S3 접속 주소가 ''<버킷이름>.localhost'' 같은 형태가 되어 매번 hosts 파일에 주소를 등록해줘야 한다. AmazonS3 amazonS3 = AmazonS3ClientBuilder .standard() .withEndpointConfiguration(localstackEndpointConfiguration) .withCredentials(localstackCrendentialProvider) .withPathStyleAccessEnabled(true) .build(); ===== 참조 ===== * [[http://woowabros.github.io/tools/2019/07/18/localstack-integration.html|LocalStack을 활용한 Integration Test 환경 만들기]] * [[https://lobster1234.github.io/2017/04/05/working-with-localstack-command-line/|Using localstack with AWS CLI]] * [[https://www.linkedin.com/pulse/using-localstack-test-sqs-sns-fabio-palumbo?articleId=6653638519531073536|Using LocalStack to test SQS & SNS]] * [[https://medium.com/@agneysh/subscribing-sns-to-sqs-on-docker-using-localstack-e4f661747049|Subscribing SNS to SQS on Docker using Localstack | by agneysh mathura | Medium]] * [[https://medium.com/@dudwls96/localstack-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0-9b81ec51749c|LocalStack 활용한 AWS 테스트 환경 구성하기. 요즘 클라우드가 대세이고 다양한 클라우드 서비스에 위에 우리는 개발을… | by Paul | Medium]] * [[https://dev.to/mrwormhole/localstack-with-terraform-and-docker-for-running-aws-locally-3a6d|Localstack with Terraform and Docker for running AWS locally - DEV Community]] * [[https://spin.atomicobject.com/2020/02/03/localstack-terraform-circleci/|LocalStack + Terraform + CircleCI for Lambda without AWS]]