<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wilson K. KOMLAN</title>
    <description>The latest articles on DEV Community by Wilson K. KOMLAN (@komlanwilson).</description>
    <link>https://dev.to/komlanwilson</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F450824%2Fc4628798-651a-4067-9820-59f0eabd20fb.jpg</url>
      <title>DEV Community: Wilson K. KOMLAN</title>
      <link>https://dev.to/komlanwilson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/komlanwilson"/>
    <language>en</language>
    <item>
      <title>Create a Fast Node.js Serverless Backend Using AWS Lambda and DynamoDB</title>
      <dc:creator>Wilson K. KOMLAN</dc:creator>
      <pubDate>Sat, 15 Jun 2024 04:22:07 +0000</pubDate>
      <link>https://dev.to/komlanwilson/create-a-fast-nodejs-serverless-backend-using-aws-lambda-and-dynamodb-12l1</link>
      <guid>https://dev.to/komlanwilson/create-a-fast-nodejs-serverless-backend-using-aws-lambda-and-dynamodb-12l1</guid>
      <description>&lt;p&gt;Build a fast Node.js serverless backend with AWS Lambda and DynamoDB. Learn to set up, secure, and perform CRUD operations efficiently&lt;/p&gt;

</description>
      <category>lambda</category>
      <category>aws</category>
      <category>awslambda</category>
      <category>dynamodb</category>
    </item>
    <item>
      <title>Spring Boot CRUD API, Amazon RDS for MySQL, AWS Secrets Manager - example</title>
      <dc:creator>Wilson K. KOMLAN</dc:creator>
      <pubDate>Sat, 11 Jun 2022 12:04:23 +0000</pubDate>
      <link>https://dev.to/aws-builders/spring-boot-crud-api-amazon-rds-for-mysql-aws-secrets-manager-example-599g</link>
      <guid>https://dev.to/aws-builders/spring-boot-crud-api-amazon-rds-for-mysql-aws-secrets-manager-example-599g</guid>
      <description>&lt;p&gt;There are many articles on how to build a real world Spring Boot CRUD REST API or Application with MySQL as Relational Database. In this post, we are not only going to show how to create a Spring Boot CRUD operations API, but we will also dive deeper into using a remote MySQL DB provided by &lt;a href="https://aws.amazon.com/rds/" rel="noopener noreferrer"&gt;Amazon RDS&lt;/a&gt;. To top it off, we'll see how to securely manage database credentials through &lt;a href="https://aws.amazon.com/secrets-manager/" rel="noopener noreferrer"&gt;AWS Secrets Manager&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;1. Have an &lt;a href="https://console.aws.amazon.com/console/home" rel="noopener noreferrer"&gt;AWS account&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Know how to configure AWS credentials on the local machine&lt;/p&gt;

&lt;p&gt;3. Be familiar with Spring Boot project&lt;/p&gt;

&lt;h2&gt;
  
  
  Create MySQL DB instance using Amazon RDS
&lt;/h2&gt;

&lt;p&gt;In this section, you will step-by-step create a MySQL DB instance using the AWS Management Console. At the end of this section you will have an online database ready to use 💪.&lt;/p&gt;

&lt;p&gt;1. Go to &lt;a href="https://console.aws.amazon.com/console/home" rel="noopener noreferrer"&gt;AWS Management Console&lt;/a&gt; and sign in.&lt;/p&gt;

&lt;p&gt;2. Choose the AWS Region you want and type &lt;em&gt;RDS&lt;/em&gt; in the &lt;strong&gt;Search for services&lt;/strong&gt; ... search bar and select it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zgd16nyx7gmgm1x6mwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zgd16nyx7gmgm1x6mwp.png" alt="AWS Management Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. &lt;a href="https://console.aws.amazon.com/rds/" rel="noopener noreferrer"&gt;RDS console&lt;/a&gt; will open. In the navigation pane, choose &lt;strong&gt;Databases&lt;/strong&gt; then &lt;strong&gt;Create database&lt;/strong&gt; on the top-right of the &lt;strong&gt;Databases&lt;/strong&gt; table to open the below page :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy617bk0ofb812sb85ldy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy617bk0ofb812sb85ldy.png" alt="Amazon RDS console : create database page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. &lt;strong&gt;Choose a database creation method&lt;/strong&gt; : &lt;em&gt;Standard create&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;5. &lt;strong&gt;Engine options&lt;/strong&gt; : &lt;em&gt;MySQL&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;6. &lt;strong&gt;Templates&lt;/strong&gt; : &lt;em&gt;Free tier&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;7. &lt;strong&gt;DB instance identifier&lt;/strong&gt; : &lt;em&gt;mydemodb&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;8. &lt;strong&gt;Master username&lt;/strong&gt; : &lt;em&gt;admin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;9. &lt;strong&gt;Master password&lt;/strong&gt; &amp;amp; &lt;strong&gt;Confirm password&lt;/strong&gt; : &lt;em&gt;adminadmin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;10. &lt;strong&gt;DB instance class&lt;/strong&gt; : &lt;em&gt;db.t2.micro&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;11. &lt;strong&gt;Public access&lt;/strong&gt; : &lt;em&gt;Yes&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;12. Click &lt;strong&gt;Additional configuration&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Initial database name&lt;/strong&gt; : &lt;em&gt;demodb&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Step 12 will make RDS create a database named &lt;strong&gt;demodb&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;13. Leave all other options as is and then click &lt;strong&gt;Create database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the database is created, click on mydemodb in the &lt;strong&gt;Databases&lt;/strong&gt; list to view its summary. We can use it at this point with basic information such as: &lt;em&gt;endpoint, port, principal user name, principal password and database&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create AWS Secrets to protect DB credentials
&lt;/h2&gt;

&lt;p&gt;We have created the MySQL database, now, to avoid hard coding  its credentials in our Spring Boot project, we'll use AWS proven service that helps easily rotate, manage, and retrieve database credentials, API keys, and other secrets through their lifecycle : &lt;a href="https://aws.amazon.com/secrets-manager/" rel="noopener noreferrer"&gt;AWS Secrets Manager&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;1. Once more, sign in to the AWS Management Console and open the Amazon Secrets Manager console &lt;a href="https://console.aws.amazon.com/secretsmanager/" rel="noopener noreferrer"&gt;here&lt;/a&gt; then make sure you choose the same AWS Region as that of the MySQL database&lt;/p&gt;

&lt;p&gt;2. In the navigation pane, choose &lt;strong&gt;Secrets&lt;/strong&gt; then &lt;strong&gt;Store a new secret&lt;/strong&gt; on the top-right of the &lt;strong&gt;Secrets&lt;/strong&gt; table to open the below page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrpf0w7do81s8s3op7qh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrpf0w7do81s8s3op7qh.png" alt="AWS Secrets Manager console : store a new secret"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. &lt;strong&gt;Secret type&lt;/strong&gt; : &lt;em&gt;Credentials for Amazon RDS database&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;4. &lt;strong&gt;User name&lt;/strong&gt; : &lt;em&gt;admin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;5. &lt;strong&gt;Password&lt;/strong&gt; : &lt;em&gt;adminadmin&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;For steps 4 and 5, use the same username and password as the database&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;6. &lt;strong&gt;Database&lt;/strong&gt; : choose &lt;em&gt;mydemodb&lt;/em&gt; DB instance and click &lt;strong&gt;Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;7. &lt;strong&gt;Secret name&lt;/strong&gt; : &lt;em&gt;demodb/dev&lt;/em&gt;, leave default options and click &lt;strong&gt;Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;8. Leave all the default options again and click &lt;strong&gt;Next&lt;/strong&gt; to go to the &lt;strong&gt;Review&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;9. Click &lt;strong&gt;Store&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;10. Once the Secret is created, click on it to preview its details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv4wcrhbccavnpv0vmm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv4wcrhbccavnpv0vmm5.png" alt="AWS Secret details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a programmatic IAM user
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you have already configured AWS credentials on your machine locally, please skip this entire section and go to &lt;strong&gt;Create Spring Boot&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In order to user AWS Secrets we've created, we need an AWS IAM user with &lt;strong&gt;&lt;em&gt;AdministratorAccess&lt;/em&gt;&lt;/strong&gt; policy. Please follow &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config" rel="noopener noreferrer"&gt;these steps&lt;/a&gt; to create an Admin IAM User and configure your local machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Spring Boot Project
&lt;/h2&gt;

&lt;p&gt;For this lab, clone the project &lt;a href="https://github.com/wilkom2009/docker-demo2.git" rel="noopener noreferrer"&gt;here&lt;/a&gt; and open it in your IDE, then follow the explanations.&lt;/p&gt;

&lt;p&gt;1. Let's explore some core dependencies necessary for the project in the &lt;em&gt;pom.xml&lt;/em&gt; file :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Spring Boot JPA dependency --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;         
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- MySQL dependency --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;mysql&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;mysql-connector-java&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;runtime&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- AWS Secrets Manager dependency --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.amazonaws&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;aws-java-sdk-secretsmanager&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.11.355 &lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2. The &lt;strong&gt;SecretValue&lt;/strong&gt; Java class in &lt;em&gt;utils&lt;/em&gt; package&lt;br&gt;
&lt;strong&gt;SecretValue.java&lt;/strong&gt; class aims to map the Secret value key/value data (DB credentials) retrieved from AWS Secrets Manager into a java object for use in the data source.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SecretValue&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;dbInstanceIdentifier&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Add Getters &amp;amp; Setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3. The &lt;strong&gt;JavaConfig.java&lt;/strong&gt; class&lt;br&gt;
In this class, the retrieval of the secret value we  created in AWS Secrets Manager is implemented.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Line 41: the secret name created in AWS Secrets Manager&lt;br&gt;
Line 42: the AWS Region where the secret is created_&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Test the REST API
&lt;/h2&gt;

&lt;p&gt;Our REST API is ready, in this section, we'll test it with Postman.&lt;/p&gt;

&lt;p&gt;1. Build the project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the root of the project, run the following command line:&lt;br&gt;
&lt;code&gt;mvn clean package&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If everything is configured correctly, the result should look like this:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fol0jr74au8hc7t11c6sc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fol0jr74au8hc7t11c6sc.png" alt="Build success"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Run the project&lt;br&gt;
Please run the API and make the following API call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Postman&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make a POST request : localhost:8080/api/team/2022&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6ky9wfd6qapo2uxx6by.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6ky9wfd6qapo2uxx6by.png" alt="POST request - API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a GET request : localhost:8080/api/team/2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8adhgzlrfsn7tcbi54ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8adhgzlrfsn7tcbi54ok.png" alt="GET request - API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations 👏👏🎉! You are almost at the end of the project. &lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus : Deploy the CRUD REST API on AWS Fargate
&lt;/h2&gt;

&lt;p&gt;As in production we need to deploy our REST API, I suggest you try creating a docker container for the API, pushing it to the Docker hub and deploying it to Amazon ECS using AWS Fargate deployment option. Please follow these simple steps outlined in this &lt;a href="https://dev.to/aws-builders/how-to-easily-deploy-a-spring-boot-application-on-aws-fargate-38nh"&gt;article.&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: To allow ECS Task to access the AWS Secrets Manager service, make sure you have &lt;strong&gt;AmazonECSTaskExecutionRolePolicy&lt;/strong&gt; and &lt;strong&gt;SecretsManagerReadWrite&lt;/strong&gt; as Permissions policies for the &lt;strong&gt;Task role&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cleanups
&lt;/h2&gt;

&lt;p&gt;After testing the REST API locally and remotely, sign in to the AWS Management Console and perform cleanups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Delete the IAM user we created in IAM console if needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete the Secret in AWS Secrets Manager console&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete MySQL database in RDS console.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, we showed how to create a Spring Boot CRUD REST API and how to manage Spring Boot MySQL connection. We also saw how to use AWS Secrets Manager in Spring Boot to protect database credentials in your REST API code. Your suggestions are welcome. Thanks for reading 🙏!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>aws</category>
      <category>mysql</category>
      <category>java</category>
    </item>
    <item>
      <title>How to Easily Deploy a Spring Boot Application on AWS Fargate</title>
      <dc:creator>Wilson K. KOMLAN</dc:creator>
      <pubDate>Sat, 04 Jun 2022 02:39:27 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-to-easily-deploy-a-spring-boot-application-on-aws-fargate-38nh</link>
      <guid>https://dev.to/aws-builders/how-to-easily-deploy-a-spring-boot-application-on-aws-fargate-38nh</guid>
      <description>&lt;p&gt;Before entering the AWS Cloud world, as a Java developer, it was often difficult for me to get Java-based applications online for my clients 😄. &lt;br&gt;
Fortunately, I found out later that AWS provides many proven, fully managed services for deploying Java-based applications such as &lt;a href="https://aws.amazon.com/ec2/" rel="noopener noreferrer"&gt;EC2&lt;/a&gt;, &lt;a href="https://aws.amazon.com/elasticbeanstalk/" rel="noopener noreferrer"&gt;Elastic Beanstalk&lt;/a&gt;, &lt;a href="https://aws.amazon.com/ecs/" rel="noopener noreferrer"&gt;Amazon ECS&lt;/a&gt; etc.&lt;/p&gt;

&lt;p&gt;In this post, we will show how to quickly deploy a Spring Boot Application on Amazon ECS with &lt;a href="https://aws.amazon.com/fargate/" rel="noopener noreferrer"&gt;AWS Fargate&lt;/a&gt; deployment option. &lt;a href="https://aws.amazon.com/fargate/" rel="noopener noreferrer"&gt;AWS Fargate&lt;/a&gt; is a Serverless compute engine that can be used to launch and run containers without having to provision or manage EC2 instances. &lt;/p&gt;

&lt;p&gt;In next lines, we will :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;See how to create a Spring Boot REST API Docker image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go through how to push a containerized API on docker repository and deploy this containerized API on AWS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an ECS Cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Fargate compatible Task Definition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the configured Task to make the application available online&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Have a &lt;a href="https://hub.docker.com/repository/" rel="noopener noreferrer"&gt;Docker repository&lt;/a&gt; account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;Install Docker Desktop&lt;/a&gt; on your local machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have an &lt;a href="https://console.aws.amazon.com/console/home" rel="noopener noreferrer"&gt;AWS account&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Create a Spring Boot REST API
&lt;/h2&gt;

&lt;p&gt;Through this section, instead of creating a Spring Boot Web application, we will create a Spring Boot Rest API for simplicity 😄. Notice that the deployment process is the same even for Spring Boot Web App and Spring Boot REST API. &lt;br&gt;
For demonstration purposes, you can clone the Git hub repository &lt;a href="https://github.com/wilkom2009/docker-demo2" rel="noopener noreferrer"&gt;here&lt;/a&gt; and open it in your favorite IDE 😎.&lt;/p&gt;
&lt;h2&gt;
  
  
  Create a Docker container image for the Spring Boot Application
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Create a Docker file
&lt;/h3&gt;

&lt;p&gt;In the project root, create a docker file named : Dockerfile (with no file extension). Paste the below content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="nl"&gt;openjdk:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;span class="no"&gt;COPY&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;SNAPSHOT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; 
&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;SNAPSHOT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt;
&lt;span class="no"&gt;CMD&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"java"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"-jar"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"docker-demo-0.0.1-SNAPSHOT.jar"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="no"&gt;EXPOSE&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Line 1 : Instruction to build docker image from openjdk:11 image&lt;br&gt;
Line 2 : Instruction to copy the jar file into the docker container file system while building&lt;br&gt;
Line 3 : is a java command to launch the jar file while executing the container&lt;br&gt;
Line 4 :  informs Docker that the container listens on 8080 port at runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Build the Docker image
&lt;/h3&gt;

&lt;p&gt;Open the terminal and execute the following docker command in the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image build &lt;span class="nt"&gt;-t&lt;/span&gt; docker-demo &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should have a result like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lh5v42q99koltgyqets.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lh5v42q99koltgyqets.png" alt="Terminal : docker build success"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test the docker image locally
&lt;/h3&gt;

&lt;p&gt;Open the terminal and execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run &lt;span class="nt"&gt;--name&lt;/span&gt; dockerDemoApp &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-d&lt;/span&gt; 
docker-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to Docker Desktop, you should see this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9xvpgbi3slm86vz4l7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9xvpgbi3slm86vz4l7n.png" alt="Docker desktop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then paste this link &lt;code&gt;http://localhost:8080/api/&lt;/code&gt; in the browser to get the following result :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1luzwbj5q9g4xmrr0y7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1luzwbj5q9g4xmrr0y7z.png" alt="Web browser showing get response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Push Docker image into Docker hub repository
&lt;/h3&gt;

&lt;p&gt;In order to push the Docker local image into Docker hub repository, you just need to execute the following command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push xxx/docker-demo-app:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Make sure to replace xxx by your user name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Deploy the Spring Boot REST API on AWS Fargate
&lt;/h2&gt;

&lt;p&gt;In this section, we will work step by step to finally get the REST API online.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create Amazon ECS Cluster
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sign in to the &lt;a href="https://console.aws.amazon.com/console/home" rel="noopener noreferrer"&gt;AWS Console&lt;/a&gt;, and type ECS in the Search bar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodt3ksu7eolbcec41bip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodt3ksu7eolbcec41bip.png" alt="Amazon ECS Cluster page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Create Cluster&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Step 1: On &lt;strong&gt;Select cluster template&lt;/strong&gt; step, select &lt;strong&gt;Networking only&lt;/strong&gt; option and click on &lt;strong&gt;Next Step&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 2: Provide the &lt;strong&gt;Cluster name&lt;/strong&gt; : &lt;em&gt;Demo-cluster&lt;/em&gt;, check &lt;strong&gt;Create VPC&lt;/strong&gt; option, leave all other default options and click on &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7zqqrydn662uhloqv6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7zqqrydn662uhloqv6f.png" alt="Amazon ECS Cluster config"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;View Cluster&lt;/strong&gt;, the Demo-cluster details should look like this:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbokvlfnlard67u4ixlnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbokvlfnlard67u4ixlnl.png" alt="Amazon ECS Cluster view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a Task Definition
&lt;/h3&gt;

&lt;p&gt;On the left side, click &lt;strong&gt;Task Definitions&lt;/strong&gt; and &lt;strong&gt;Create new Task Definition&lt;/strong&gt; to access the Create new Task Definition page.&lt;/p&gt;

&lt;h4&gt;
  
  
  a. Step 1: Select launch type compatibility
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;FARGATE&lt;/strong&gt; then click on &lt;strong&gt;Next Step&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  b. Step 2: Configure task and container definitions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Type the &lt;strong&gt;Task definition name&lt;/strong&gt; : &lt;em&gt;docker-demo-task&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Leave &lt;strong&gt;Task role&lt;/strong&gt; as is (an IAM role for ECS Task definition will be created on your behalf ) &lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;Linux&lt;/em&gt; as &lt;strong&gt;Operating system family&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task execution role&lt;/strong&gt;, leave &lt;em&gt;Create new role&lt;/em&gt; option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task memory (GB)&lt;/strong&gt; : 1GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task CPU (vCPU)&lt;/strong&gt; : &lt;em&gt;0.5vCPU&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Add Container&lt;/strong&gt;, and the information below:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- &lt;strong&gt;Container name&lt;/strong&gt; : &lt;em&gt;dockerDemoApp&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;Image&lt;/strong&gt; : &lt;em&gt;xxx/docker-demo-app:latest&lt;/em&gt;, the Docker hub image repository (xxx : your Docker hub user name)&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;Memory Limits (MiB)&lt;/strong&gt; : Soft limit : &lt;em&gt;128&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;Port mappings&lt;/strong&gt; : &lt;em&gt;80 -&amp;gt; tcp&lt;/em&gt; and &lt;em&gt;8080 -&amp;gt; tcp&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyerujngjtiwxmt5l0u8u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyerujngjtiwxmt5l0u8u.png" alt="ECS Container config"&gt;&lt;/a&gt;&lt;br&gt;
-- Click on &lt;strong&gt;Add&lt;/strong&gt; to navigate back to &lt;strong&gt;Create new Task Definition&lt;/strong&gt; page&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Leave all other options and click on &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;View task definition&lt;/strong&gt; to see the created task definition details.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmakos9s8znmq0ubv88ad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmakos9s8znmq0ubv88ad.png" alt="Amazon ECS Task definition detail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Run the Task Definition
&lt;/h3&gt;

&lt;p&gt;In this last section, we are going to run our Docker container image.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1
&lt;/h4&gt;

&lt;p&gt;In the &lt;strong&gt;Task Definition: docker-demo-task:1&lt;/strong&gt; page, click on &lt;strong&gt;Actions&lt;/strong&gt; then &lt;strong&gt;Run Task&lt;/strong&gt;, the &lt;strong&gt;Run Task&lt;/strong&gt; page will open.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbiysrp7br17ac2sjclxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbiysrp7br17ac2sjclxw.png" alt="Amazon ECS Run Task"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Launch type&lt;/strong&gt; : &lt;em&gt;FARGATE&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating system family&lt;/strong&gt; : &lt;em&gt;Linux&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task Definition&lt;/strong&gt; : &lt;strong&gt;Familly&lt;/strong&gt; -&amp;gt; &lt;em&gt;docker-demo-task&lt;/em&gt; / &lt;strong&gt;Revision&lt;/strong&gt; -&amp;gt; &lt;em&gt;1&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform version&lt;/strong&gt; : &lt;em&gt;LATEST&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster&lt;/strong&gt; : &lt;em&gt;Demo-cluster&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of tasks&lt;/strong&gt; : &lt;em&gt;1&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster VPC&lt;/strong&gt; : select your VPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets&lt;/strong&gt; : Choose un subnet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security groups&lt;/strong&gt; : click on &lt;strong&gt;Edit&lt;/strong&gt; to modify the default security group as follow :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cfcnr7rffqpqvj4x85l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cfcnr7rffqpqvj4x85l.png" alt="ECS running Task security group config"&gt;&lt;/a&gt;&lt;br&gt;
-- &lt;strong&gt;Assigned security groups&lt;/strong&gt; : &lt;em&gt;Create new security group&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;Security group name&lt;/strong&gt; : &lt;em&gt;docker-demo-sg&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;Inbound rules for security group&lt;/strong&gt; : Choose &lt;em&gt;All Traffic&lt;/em&gt; &lt;strong&gt;Type&lt;/strong&gt; and &lt;em&gt;Anywhere&lt;/em&gt; &lt;strong&gt;Source&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-- Click on &lt;strong&gt;Save&lt;/strong&gt;, you will be redirected to the &lt;strong&gt;Run Task&lt;/strong&gt; page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-assign public IP&lt;/strong&gt; : &lt;em&gt;ENABLED&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave all other default options and click on &lt;strong&gt;Run Task&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj6zz7w38oeyoybcwjj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj6zz7w38oeyoybcwjj7.png" alt="Amazon ECS Task running"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Access Spring Boot REST API via public address
&lt;/h2&gt;

&lt;p&gt;Now that the deployed API's container is running, let's try to access it through a public IP address.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Task details
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3n19keu3gw7u5gdzenu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3n19keu3gw7u5gdzenu.png" alt="Amazon ECS Task click"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Demo-cluster&lt;/strong&gt; details page, go to &lt;strong&gt;Tasks&lt;/strong&gt; tab. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the listed tasks, click on the &lt;strong&gt;Task&lt;/strong&gt; whose &lt;strong&gt;Task definition&lt;/strong&gt; column is &lt;em&gt;docker-demo-task:1&lt;/em&gt;, the Task details page should open.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 2: Task public IP address
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9nd2hgvu8eu1m8wxkqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9nd2hgvu8eu1m8wxkqz.png" alt="Amazon ECS Task definition running"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the Task details page, copy the Public IP address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open a browser or Postman, paste the IP address, append the port and /api/ to see the magic happen 👍 🚀 !&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k9ll87ks06i5th8cus1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k9ll87ks06i5th8cus1.png" alt="Web browser showing Get response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clean up
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In the Task details page, click on &lt;strong&gt;Stop&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In Demo-cluster page, click on &lt;strong&gt;Delete Cluster&lt;/strong&gt; then follow the instructions to delete the Cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Through this post, we saw how to easily and quickly deploy a Spring Boot Application on AWS using AWS Fargate by creating a Spring Boot REST API Docker container image, pushing it on the Docker hub repository, creating and configuring Amazon ECS Cluster and Task definition witch helped us to deploy and run our REST API container image on AWS Cloud.&lt;br&gt;
Thanks for the reading.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>aws</category>
      <category>java</category>
      <category>docker</category>
    </item>
    <item>
      <title>How to secure Spring boot REST API endpoints with Amazon Cognito</title>
      <dc:creator>Wilson K. KOMLAN</dc:creator>
      <pubDate>Thu, 02 Jun 2022 12:03:48 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-to-secure-spring-boot-rest-api-endpoints-with-amazon-cognito-2fkl</link>
      <guid>https://dev.to/aws-builders/how-to-secure-spring-boot-rest-api-endpoints-with-amazon-cognito-2fkl</guid>
      <description>&lt;p&gt;Hello! For Java backend developers, with &lt;a href="https://docs.spring.io/spring-security/reference/getting-spring-security.html" rel="noopener noreferrer"&gt;Spring security&lt;/a&gt; there are many ways to secure &lt;a href="https://spring.io/projects/spring-boot" rel="noopener noreferrer"&gt;Spring boot&lt;/a&gt; Rest APIs. &lt;/p&gt;

&lt;p&gt;Usually, implementing Spring boot bearer token functionality for Rest API requires many lines of code, hours, and the need for user management. However, using Spring boot AWS authentication thanks to &lt;a href="https://aws.amazon.com/cognito/" rel="noopener noreferrer"&gt;Amazon Cognito&lt;/a&gt;, things become very simple and very very fast. We no longer need to manage users, &lt;a href="https://aws.amazon.com/cognito/" rel="noopener noreferrer"&gt;Amazon Cognito user pool&lt;/a&gt; takes care of that. Cognito also allows us to share users between many Rest APIs and front-ends (web, mobile).&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Amazon Cognito User Pool
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in into &lt;a href="https://console.aws.amazon.com/console/home" rel="noopener noreferrer"&gt;Amazon console&lt;/a&gt;, and then search for : Cognito.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mzr8zys2pwa7imymvtf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mzr8zys2pwa7imymvtf.png" alt="Amazon Cognito page"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Create User Pool&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;em&gt;Configure sign-in experience&lt;/em&gt; step, check &lt;strong&gt;User name&lt;/strong&gt;, &lt;strong&gt;Email&lt;/strong&gt; and &lt;strong&gt;Allow users to sign in with a preferred user name&lt;/strong&gt; options then click on &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;em&gt;Configure security requirements&lt;/em&gt; step, leave all the default options except &lt;strong&gt;MFA enforcement&lt;/strong&gt; where you should choose &lt;strong&gt;No MFA&lt;/strong&gt; instead of &lt;strong&gt;Require MFA - Recommended&lt;/strong&gt;, then click on &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 3 : &lt;em&gt;Configure sign-up experience&lt;/em&gt;, leave all default options and click on &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 4: &lt;em&gt;Configure message delivery&lt;/em&gt;, choose &lt;strong&gt;Send email with Cognito&lt;/strong&gt; for &lt;strong&gt;Email provider&lt;/strong&gt; and leave all other default options then click on &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 5: &lt;em&gt;Integrate your app&lt;/em&gt;, provide the &lt;strong&gt;User pool name&lt;/strong&gt; : &lt;em&gt;&lt;strong&gt;Demo-user-pool&lt;/strong&gt;&lt;/em&gt;, &lt;strong&gt;App client name&lt;/strong&gt;: &lt;em&gt;&lt;strong&gt;Dockerdemo-app&lt;/strong&gt;&lt;/em&gt;, leave other default options and click Next.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 6: Review and click on &lt;strong&gt;Create User Pool&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes48n2tpdzh4o7ntyasd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes48n2tpdzh4o7ntyasd.png" alt="Amazon cognito Demo user pool"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the details page of the created user pool, click on &lt;strong&gt;App Integration&lt;/strong&gt; tab -&amp;gt; &lt;strong&gt;Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create Cognito Domain&lt;/strong&gt; and provide the domain name then click &lt;strong&gt;Create Cognito Domain&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Again, in the &lt;strong&gt;App Integration&lt;/strong&gt; tab, navigate to the  &lt;strong&gt;App client list&lt;/strong&gt; section and click on &lt;strong&gt;Dockerdemo-app&lt;/strong&gt; to preview its details.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1b6d41zcxyvqn9ltmjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1b6d41zcxyvqn9ltmjv.png" alt="Amazon cognito app client details"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;App client&lt;/strong&gt; details, scroll down to the &lt;strong&gt;Pinpoint analytics&lt;/strong&gt; section and click on &lt;strong&gt;Edit&lt;/strong&gt;, the &lt;strong&gt;Edit Hosted UI&lt;/strong&gt; page will open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Edit Hosted UI&lt;/strong&gt; page, provide the &lt;strong&gt;Allowed callback URLs&lt;/strong&gt; : &lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;, check &lt;strong&gt;Cognito user pool&lt;/strong&gt; in the &lt;strong&gt;Identity providers&lt;/strong&gt; section, check all &lt;strong&gt;OpenID Connect scopes&lt;/strong&gt; options then click &lt;strong&gt;Save changes&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Back to the &lt;strong&gt;App client&lt;/strong&gt; details, the Pinpoint analytics section should look like the image below:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffblvzua7z90e7tkrqk6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffblvzua7z90e7tkrqk6l.png" alt="Amazon cognito App client hosted UI"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure to save the Cognito domain from the &lt;strong&gt;Domain&lt;/strong&gt; section, and the &lt;strong&gt;Client ID&lt;/strong&gt; for the created client App from the  &lt;strong&gt;App client list&lt;/strong&gt; section.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create Spring boot Rest API
&lt;/h2&gt;

&lt;p&gt;In this section, we will create a spring boot Rest API. For demonstration purposes, you can clone the Git hub repository &lt;a href="https://github.com/wilkom2009/docker-demo.git" rel="noopener noreferrer"&gt;here&lt;/a&gt; and open it in your favorite IDE.&lt;br&gt;
The idea here is to implement Spring security Rest API authentication with &lt;a href="https://docs.spring.io/spring-security/reference/servlet/oauth2/resource-server/index.html" rel="noopener noreferrer"&gt;OAuth 2.0 JWT Bearer Tokens&lt;/a&gt;. &lt;br&gt;
Instead of implementing the &lt;a href="https://wilkom2009.hashnode.dev/java-fullstack-backend-rest-api-spring-security-and-jwt-a" rel="noopener noreferrer"&gt;JWT authentication tokens generation mechanism&lt;/a&gt;,  we will use Amazon Cognito to manage it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Provide the needed dependencies in the &lt;strong&gt;pom.xml&lt;/strong&gt; file for Spring security OAuth 2.0 support&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-security&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;             
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-oauth2-resource- 
server&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;In the &lt;strong&gt;application.yaml&lt;/strong&gt; file, specify the Authorization Server:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;oauth2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resourceserver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;jwt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;issuer-uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://cognito-idp.[AWS REGION].amazonaws.com/[USER_POOL_ID]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Create a security configuration file.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.wilkom.dockerdemo.security&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.config.annotation.web.builders.HttpSecurity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.config.annotation.web.configuration.EnableWebSecurity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.web.SecurityFilterChain&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@EnableWebSecurity&lt;/span&gt; &lt;span class="c1"&gt;// Enable Spring Security’s web &lt;/span&gt;
  &lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt;
&lt;span class="nd"&gt;@EnableGlobalMethodSecurity&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;securedEnabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prePostEnabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// To configure method-level security&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SecurityConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;SecurityFilterChain&lt;/span&gt; &lt;span class="nf"&gt;filterChain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpSecurity&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;csrf&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;disable&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authorizeRequests&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expressionInterceptUrlRegistry&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;expressionInterceptUrlRegistry&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;anyRequest&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;authenticated&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;oauth2ResourceServer&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;In the configuration class above, we have made each endpoint accessible only by OAuth 2.0 authenticated requests. That's all we have to do in our API Rest backend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Test the Rest API
&lt;/h2&gt;

&lt;p&gt;We will use Postman to test our Rest API.&lt;/p&gt;

&lt;p&gt;1. Signup user into the Amazon Cognito&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Open Postman and provide values from Amazon Cognito User provider settings:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4y6r0uj5qvxns0vyyx7.png" alt="Postman Authorization Token generation"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;2/ Callback URL : &lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt; (make sure to provide the exact callback url you set in the Cognito)&lt;br&gt;
3/ Auth URL : &lt;a href="https://xxxxx.auth.us-east-1.amazoncognito.com/login" rel="noopener noreferrer"&gt;https://xxxxx.auth.us-east-1.amazoncognito.com/login&lt;/a&gt; (remember to append /login)&lt;br&gt;
4/ Access Token URL : &lt;a href="https://xxxxx.auth.us-east-1.amazoncognito.com/oauth2/token" rel="noopener noreferrer"&gt;https://xxxxx.auth.us-east-1.amazoncognito.com/oauth2/token&lt;/a&gt; (remember to append /oauth2/token)&lt;br&gt;
5/ Client ID : Dockerdemo-app &lt;strong&gt;App Client ID&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Then click on &lt;strong&gt;Get New Access Token&lt;/strong&gt; at the bottom, the Sign-in screen will open, click on Sign up link at the bottom the get the signup screen as follow:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5fw3eue1eqpmltiz26x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5fw3eue1eqpmltiz26x.png" alt="Cognito Sign up screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enter user name, valid email and password then click on Sign-up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The verification code screen should appear, open the valid email box to get the verification code:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx47j45zhuqiojux21owd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx47j45zhuqiojux21owd.png" alt="Cognito verification code screen"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the code verification is successful, a token will be generated, click on &lt;strong&gt;Use Token&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef24wchi4tulhov63sf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef24wchi4tulhov63sf5.png" alt="Postman token generated"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2. Make API call&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now, you can run the Spring boot app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to Postman, enter a GET endpoint URL,&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;localhost:8080/api/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
Make sure the token is in use in the Authorization OAuth 2.0 tab and click on &lt;strong&gt;Send&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyqemitzvf6khp32bd5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyqemitzvf6khp32bd5d.png" alt="Postman Get request successful"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PS : In a real project, the Signup and Sign-in processes will be implemented in the front-end apps, please see &lt;a href="https://aws.amazon.com/cognito/getting-started/" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; to do so.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can see, Amazon Cognito is an amazing AWS service that simplifies Spring boot backend Rest API user management.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>java</category>
      <category>api</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
