スポンサーリンク

Amazon ECS デプロイ(CD/CI)

SpringBootをAWS ECSで動かす

投稿日:

Step1.準備 Spring Bootアプリケーションを作成する

SpringInitializrで新規プロジェクトを作成し、動作確認を行います。

Spring Webだけを選択しました。

次に、IDEで適当なコントローラーを作成します。
ここでは、パス"/"に対して、「Hello Spring-Docker!」をレスポンスする簡易なものです。

package com.springhack.springdocker;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class IndexController {
    @RequestMapping
    public String index() {
        return "Hello Spring-Docker!";
    }
}

コードを書いたら、Gradle bootRunにより起動して、ブラウザからアクセスして、動作確認を行なってください。

Step2.SpringBootプロジェクトをDockerイメージ化する

dockerでSpringBootを起動する」を参考に、Dockerイメージを作成します。

プロジェクトルートにDockerfileを作成します。

FROM openjdk:11
ARG JAR_FILE=target/*jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

ここまでで、このようになっています。

動作確認時のbootRunで、build/lib配下に.jarが作成されていると思いますが、ない人はGradle booJarで.jarを作成してください。

次に、Dockerイメージを作成します。

spring-docker % docker build --build-arg JAR_FILE=build/libs/\*.jar -t spring-docker .
[+] Building 39.6s (8/8) FINISHED                                                                                                                                           
 => [internal] load build definition from Dockerfile                                                                                                                   0.0s
 => => naming to docker.io/library/spring-docker                                                                                                                       0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

エラーが出てなければOKです。

docker iamge ls でイメージが作成されていることを確認してください。

% docker image ls
REPOSITORY                                                       TAG         IMAGE ID       CREATED         SIZE
spring-docker                                                    latest      ef2935f9fe8f   2 minutes ago   663MB

イメージをもとにコンテナを起動して、イメージが正常に使用できるか確認します。

% docker run -p 80:8080 spring-docker 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.5)

2022-10-30 03:09:52.777  INFO 1 --- [           main] c.s.s.SpringDockerApplication            : Starting SpringDockerApplication using Java 11.0.16 on 1a314c8c8ad4 with PID 1 (/app.jar started by root in /)
2022-10-30 03:09:52.779  INFO 1 --- [           main] c.s.s.SpringDockerApplication            : No active profile set, falling back to 1 default profile: "default"
2022-10-30 03:09:53.258  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-10-30 03:09:53.263  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-30 03:09:53.263  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-30 03:09:53.306  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-10-30 03:09:53.306  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 497 ms
2022-10-30 03:09:53.485  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-30 03:09:53.491  INFO 1 --- [           main] c.s.s.SpringDockerApplication            : Started SpringDockerApplication in 0.942 seconds (JVM running for 1.151)

正常にコンテナが起動できたら、ブラウザからアクセスして動作確認します。

gradle bootRunで起動した時と同じ画面が表示できていればOKです。

Step3.DockerイメージをAWS ECRにプッシュする

次に、作成したDockerイメージをAWS ECRにプッシュしましょう。

AWSにアクセスして、ECRの「リポジトリを作成」を押します。

https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1

プライベートなリポジトリを作成します。

正常に作成されたら、「プッシュコマンドの表示」を押します。

プッシュコマンドが表示されるので、その通りにターミナルからコマンド実行していきます。

spring-docker % aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 4835XXXX403.dkr.ecr.ap-northeast-1.amazonaws.com

WARNING! Your password will be stored unencrypted in /Users/username/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

spring-docker % docker tag spring-docker:latest 483521815403.dkr.ecr.ap-northeast-1.amazonaws.com/spring-docker:latest

spring-docker % docker push 483521815403.dkr.ecr.ap-northeast-1.amazonaws.com/spring-docker:latest
The push refers to repository [483521815403.dkr.ecr.ap-northeast-1.amazonaws.com/spring-docker]
cac5dff30a60: Pushed 
bd245ec49ee5: Pushed 
latest: digest: sha256:20cfdb8453e53bd165dfa3fb4d22482bcf52bcd24e686be4b91d9b5aaf40f003 size: 2007

コマンドを終えたら、ECRの画面上に反映されているか確認します。

イメージが表示されていればOKです。

URIのコピーを押して、ECRリポジトリのURIを控えておいてください。

ECRの費用

ECRには費用がかかるので、使い終えたら削除してください。

https://aws.amazon.com/jp/ecr/pricing/

  • プライベートリポジトリまたはパブリックリポジトリに保存されたデータのストレージは、GB/月あたり 0.10USD です。
  • プライベートリポジトリから転送されたデータ:最初の 9.999 TB/月 0.114USD/GB

Step4.AWS ECSでコンテナを起動する

いよいよECSでコンテナを起動します。
あと一歩なので頑張ってください。

4-1.クラスターの作成

Amazon Elastic Container Service>クラスター の「クラスターの作成」を押して、ECSクラスターを作成します。

クラスター名は任意のクラスター名を入力します。

ネットワーキングの項目は、本番では適切なネットワークおよびサブネットを指定しますが、ここではデフォルトを使用します。

インフラストラクチャはFargateのままでOKです。
作成を押してください。

作成したクラスターが一覧に表示されていればOKです。

4-2.タスク定義の作成

タスク定義を作成することは、クラスター上で動かすコンテナを定義することです。

Amazon Elastic Container Service>新しいタスク定義の作成に入力していきます。

ステップ 1 タスク定義とコンテナの設定は、次のようにします。

タスク定義ファミリーは、適当な名前をつけます。
コンテナの詳細>名前も、適当な名前をつけます。
コンテナの詳細>イメージURIは、ECRのリポジトリのイメージのURIをコピーして貼り付けます。
コンテナの詳細>コンテナポートは、springBootは8080で起動するので「8080」と入力します。

ステップ 2 環境、ストレージ、モニタリング、タグの設定 と、
ステップ 3 確認して作成 はそのままでOKです。
タスク定義の作成を完了してください。

タスク定義の一覧に表示されていればOKです。

4-3.サービスの作成

いよいよ、タスク定義を元に、クラスターにコンテナをデプロイします。

4-1で作成したクラスターの画面から、デプロイを押します。

デプロイを設定していきます。

一番下のデプロイを押します。

画面上部に、デプロイが進行中と表示されます。
コンテナ起動に数分かかりますので、待ちます。

数分すると、クラスターに対してサービスが表示されています。

サービス名を押してください。

Step5.動作確認する

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Amazon ECS, デプロイ(CD/CI)

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.