{"id":18048065,"url":"https://github.com/ivangfr/springboot-aws-localstack-opensearch-s3-secretsmanager","last_synced_at":"2025-08-23T01:46:18.256Z","repository":{"id":50741541,"uuid":"506791745","full_name":"ivangfr/springboot-aws-localstack-opensearch-s3-secretsmanager","owner":"ivangfr","description":"In this project, we will use LocalStack to locally simulate some services provided by AWS Cloud such as OpenSearch, S3, and Secrets Manager. Additionally, to simplify the use of AWS managed services, we will use Spring Cloud AWS.","archived":false,"fork":false,"pushed_at":"2025-03-09T06:34:12.000Z","size":21226,"stargazers_count":11,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T09:54:27.578Z","etag":null,"topics":["aws","aws-opensearch","aws-s3","aws-secrets-manager","docker","java","localstack","omdb-api","semantic-ui","spring-boot","spring-cloud-aws","spring-web-mvc","springdoc-openapi","thymeleaf"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivangfr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"ivangfr"}},"created_at":"2022-06-23T21:06:53.000Z","updated_at":"2025-03-11T08:26:08.000Z","dependencies_parsed_at":"2024-03-22T10:54:06.970Z","dependency_job_id":"e98d9e51-7841-4f72-8a24-6281ea6d7fb5","html_url":"https://github.com/ivangfr/springboot-aws-localstack-opensearch-s3-secretsmanager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ivangfr/springboot-aws-localstack-opensearch-s3-secretsmanager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivangfr","download_url":"https://codeload.github.com/ivangfr/springboot-aws-localstack-opensearch-s3-secretsmanager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271731682,"owners_count":24811308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-22T02:00:08.480Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-opensearch","aws-s3","aws-secrets-manager","docker","java","localstack","omdb-api","semantic-ui","spring-boot","spring-cloud-aws","spring-web-mvc","springdoc-openapi","thymeleaf"],"created_at":"2024-10-30T20:11:12.816Z","updated_at":"2025-08-23T01:46:18.247Z","avatar_url":"https://github.com/ivangfr.png","language":"Java","funding_links":["https://github.com/sponsors/ivangfr"],"categories":[],"sub_categories":[],"readme":"# springboot-aws-localstack-opensearch-s3-secretsmanager\n\nIn this project, we will use [`LocalStack`](https://localstack.cloud/) to locally simulate some services provided by [`AWS Cloud`](https://aws.amazon.com/) such as [`OpenSearch`](https://aws.amazon.com/opensearch-service/), [`S3`](https://aws.amazon.com/s3/), and [`Secrets Manager`](https://aws.amazon.com/secrets-manager/). Additionally, to simplify the use of AWS managed services, we will use [`Spring Cloud AWS`](https://spring.io/projects/spring-cloud-aws).\n\n\u003e **Note**: Check out the [`springboot-aws-localstack-dynamodb-lambda-sns-sqs`](https://github.com/ivangfr/springboot-aws-localstack-dynamodb-lambda-sns-sqs) repository. In it, we have developed two Spring Boot applications for producing and listening to news updates. We also utilized LocalStack to locally simulate AWS Cloud services such as [`DynamoDB`](https://aws.amazon.com/dynamodb/), [`Lambda`](https://aws.amazon.com/lambda/), [`SNS`](https://aws.amazon.com/sns/) and [`SQS`](https://aws.amazon.com/sqs/).\n\n## Proof-of-Concepts \u0026 Articles\n\nOn [ivangfr.github.io](https://ivangfr.github.io), I have compiled my Proof-of-Concepts (PoCs) and articles. You can easily search for the technology you are interested in by using the filter. Who knows, perhaps I have already implemented a PoC or written an article about what you are looking for.\n\n## Additional Readings\n\n- \\[**Medium**\\] [**Spring Boot Apps for Movie Indexing/Search with AWS OpenSearch, S3 and Secrets Manager**](https://medium.com/@ivangfr/spring-boot-apps-for-movie-indexing-search-with-aws-opensearch-s3-and-secrets-manager-a95ad0697e51)\n- \\[**Medium**\\] [**Spring Boot apps to trigger and consume DynamoDB News table updates using AWS Lambda, SNS and SQS**](https://medium.com/@ivangfr/spring-boot-apps-to-trigger-and-consume-dynamodb-news-table-updates-using-aws-lambda-sns-and-sqs-957570cf9a3a)\n- \\[**Medium**\\] [**Implementing a Spring Boot App using AWS DynamoDB as database**](https://medium.com/@ivangfr/implementing-a-spring-boot-app-using-aws-dynamodb-as-database-5dbf8b7fc924)\n- \\[**Medium**\\] [**Implementing a Spring Boot App that uses AWS Secrets Manager to store its MongoDB credentials**](https://medium.com/@ivangfr/implementing-a-spring-boot-app-that-uses-aws-secrets-manager-to-store-its-mongodb-credentials-f805a4c74d9a)\n- \\[**Medium**\\] [**Implementing a Serverless AWS Lambda with Spring Cloud Function \u0026 AWS Adapter**](https://medium.com/@ivangfr/implementing-a-serverless-aws-lambda-with-spring-cloud-function-aws-adapter-05fd6d48ba45)\n- \\[**Medium**\\] [**Using AWS SNS and SQS to stream Alerts from a Spring Boot producer to consumers**](https://medium.com/@ivangfr/using-aws-sns-and-sqs-to-stream-alerts-from-a-spring-boot-producer-to-consumers-0b0a974e40fc)\n\n## Project Diagram\n\n![project-diagram](documentation/project-diagram.jpeg)\n\n## Applications\n\n- ### movie-api\n\n  [`Spring Boot`](https://docs.spring.io/spring-boot/index.html) Java Web application that exposes a REST API and provides a UI for indexing movies.\n\n  It has the following endpoints:\n  ```text\n   GET /api/movies/{imdb}\n  POST /api/movies {\"imdb\":\"...\", \"title\":\"...\", \"posterUrl\":\"...\", \"year\":\"...\", \"released\":\"...\", \"imdbRating\":\"...\", \"genre\":\"...\", \"runtime\":\"...\", \"director\":\"...\", \"writer\":\"...\", \"actors\":\"...\", \"plot\":\"...\", \"language\":\"...\", \"country\":\"...\", \"awards\":\"...\"}\n  POST /api/movies/{imdb}/uploadPoster\n  ```\n\n  The information of the movies, such as `imdb`, `title`, `year`, etc, are stored in `OpenSearch` that is hosted in `LocalStack`. The movie's `poster` is stored in `S3` buckets.\n\n  The `movie-api` has access to [`OMDb API`](https://www.omdbapi.com/) to search and add easily new movies. To make requests to `OMDb API`, an `apiKey` is needed. This key is stored as a secret in `Secrets Manager`.\n\n- ### movie-ui\n\n  `Spring Boot` Java Web application with a user interface designed for searching movies indexed in `movie-api`. To populate its UI with movie data, `movie-ui` communicates with `movie-api` by making requests to its endpoints. The movie’s poster is retrieved from the `S3` bucket.\n\n## Prerequisites\n\n- [`Java 21`](https://www.oracle.com/java/technologies/downloads/#java21) or higher;\n- A containerization tool (e.g., [`Docker`](https://www.docker.com), [`Podman`](https://podman.io), etc.)\n- [`OMDb API`](https://www.omdbapi.com/) KEY\n\n  To search for movies in `OMDb API`, we need to obtain an API KEY from `OMDb API`. To do it, access https://www.omdbapi.com/apikey.aspx and follow the steps provided by the website.\n\n## Start and Initialize LocalStack\n\n- In a terminal, make sure you are inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder;\n\n- Start `LocalStack` Docker container:\n  ```bash\n  DEBUG=1 docker compose up -d\n  ```\n\n- \\[Optional\\] Debug logs are enabled to provide more insights into what is happening. To monitor `localstack` Docker container logs, run the command below:\n  ```bash\n  docker logs localstack\n  ```\n\n- Initialize `LocalStack` by running the following script:\n  ```bash\n  ./init-localstack.sh \u003cOMDB_API_KEY\u003e\n  ```\n  The script requires `OMDB_API_KEY` as first and unique argument. The script will create:\n  - a domain for `OpenSearch` as well as the `movies` index using the `movies-settings.json` provided;\n  - bucket `com.ivanfranchin.movieapi.posters` in `S3`;\n  - a secret for `OMDB_API_KEY` in `Secrets Manager`.\n\n## Running applications with Maven\n\n- **movie-api**\n  \n  In a terminal, inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder, run the following command:\n  ```bash\n  export AWS_REGION=eu-west-1 \u0026\u0026 export AWS_ACCESS_KEY_ID=key \u0026\u0026 export AWS_SECRET_ACCESS_KEY=secret \u0026\u0026 \\\n    ./mvnw clean spring-boot:run --projects movie-api\n  ```\n\n- **movie-ui**\n\n  In another terminal and, inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder, run the command below:\n  ```bash\n  ./mvnw clean spring-boot:run --projects movie-ui\n  ```\n\n## Running applications as Docker container\n\n- ### Build Docker images\n\n  In a terminal, inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder, run the following script:\n  ```bash\n  ./build-docker-images.sh\n  ```\n\n- ### Run Docker containers\n\n  - **movie-api**\n    \n    In a terminal, run the following command:\n    ```bash\n    docker run --rm --name movie-api -p 9080:9080 \\\n      -e AWS_REGION=eu-west-1 -e AWS_ACCESS_KEY_ID=key -e AWS_SECRET_ACCESS_KEY=secret \\\n      --network=springboot-aws-localstack-opensearch-s3-secretsmanager_default \\\n      ivanfranchin/movie-api:1.0.0\n    ```\n\n  - **movie-ui**\n\n    In another terminal, run the command below:\n    ```bash\n    docker run --rm --name movie-ui -p 9081:9081 \\\n      -e MOVIE_API_URL=http://movie-api:9080 \\\n      --network=springboot-aws-localstack-opensearch-s3-secretsmanager_default \\\n      ivanfranchin/movie-ui:1.0.0\n    ```\n\n## Application URL\n\n| Application | Type    | URL                                   |\n|-------------|---------|---------------------------------------|\n| `movie-api` | Swagger | http://localhost:9080/swagger-ui.html |\n| `movie-api` | UI      | http://localhost:9080                 |\n| `movie-ui`  | UI      | http://localhost:9081                 |\n\n## Demo\n\n- **Adding movie**: in the GIF below, we are using `movie-api` to add the movie _\"American Pie 2\"_\n\n  ![demo-adding-movie](documentation/demo-adding-movie.gif)\n\n- **Searching movies**: in the GIF below, we are using `movie-ui` to search for movies\n\n  ![demo-searching-movies](documentation/demo-searching-movies.gif)\n\n## Useful Links\n\n- **OpenSearch**\n\n  Check indexes\n  ```bash\n  curl \"http://localhost.localstack.cloud:4566/opensearch/eu-west-1/my-domain/_cat/indices?v\"\n  ```\n  \n  Simple search\n  ```bash\n  curl \"http://localhost.localstack.cloud:4566/opensearch/eu-west-1/my-domain/movies/_search?pretty\"\n  ```\n\n## Shutdown\n\n- To stop the applications, go to the terminal where they are running and press `Ctrl+C`;\n- To stop and remove Docker Compose containers, network, and volumes, go to a terminal and, inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder, run the following command:\n  ```bash\n  docker compose down -v\n  ```\n\n## Cleanup\n\nTo remove the Docker images created by this project, go to a terminal and, inside the `springboot-aws-localstack-opensearch-s3-secretsmanager` root folder, run the script below:\n```bash\n./remove-docker-images.sh\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivangfr%2Fspringboot-aws-localstack-opensearch-s3-secretsmanager/lists"}