

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EKS にサンプル Java マイクロサービスをデプロイし、Application Load Balancer を使用してマイクロサービスを公開する
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer"></a>

*Amazon Web Services、Vijay Thompson および Akkamahadevi Hiremath*

## 概要
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-summary"></a>

このパターンでは、`eksctl` コマンドラインユーティリティと Amazon Elastic Container Registry (Amazon ECR) を使用して、サンプル Java マイクロサービスをコンテナ化されたアプリケーションとして Amazon Elastic Kubernetes Service (Amazon EKS) にデプロイする方法を説明します。Application Load Balancer を使用して、アプリケーショントラフィックをロードバランスします。

## 前提条件と制限
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ macOS、Linux、または Windows にインストールおよび設定されている AWS コマンドラインインターフェイス (AWS CLI) バージョン 1.7 以降
+ 実行中の [Docker デーモン](https://docs.docker.com/config/daemon/)
+ macOS、Linux、または Windows にインストールおよび設定されている `eksctl` コマンドラインユーティリティ (詳細については、Amazon EKS ドキュメントの [Amazon EKS の使用開始 — eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) を参照してください。)
+ macOS、Linux、または Windows にインストールおよび設定されている `kubectl` コマンドラインユーティリティ (詳細については、Amazon EKS ドキュメントの「[kubectl のインストールまたは更新](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)を参照してください。)

**制限**
+ このパターンは、Application Load Balancer の SSL 証明書のインストールには適用されません。

## アーキテクチャ
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-architecture"></a>

**ターゲットテクノロジースタック**
+ Amazon ECR
+ Amazon EKS
+ エラスティックロードバランシング

**ターゲットアーキテクチャ**

次の図は、Amazon EKS で Java マイクロサービスをコンテナ化するアーキテクチャを示しています。

![\[Amazon EKS にコンテナ化されたアプリケーションとしてデプロイされた Java マイクロサービス。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e1dd8ab0-9e1e-4d2b-b7af-89d3e583e57c/images/aaca4fd9-5aaa-4df5-aebd-02a2ed881c3b.png)


## ツール
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-tools"></a>
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、安全、スケーラブル、信頼できるマネージド型のコンテナイメージのレジストリサービスです。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) は、AWS で Kubernetes を実行する際に役立ち、独自の Kubernetes コントロールプレーンまたはノードをインストールまたは維持する必要はありません。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) は、受信トラフィックを複数のアベイラビリティーゾーン(Amazon Elastic Compute Cloud (Amazon EC2)のインスタンス、コンテナ、IP アドレスなど) の複数のターゲットに自動的に配信します。
+ [eksctl](https://eksctl.io/) は Amazon EKS にクラスターを作成する上で役立ちます。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) を使用すると、Kubernetes クラスターにコマンドを実行できるようになります。
+ [Docker](https://www.docker.com/) は、コンテナと呼ばれるパッケージにアプリケーションをビルド、テスト、配信する上で役立ちます。

## エピック
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-epics"></a>

### eksctl を使用して Amazon EKS クラスターを作成する
<a name="create-an-amazon-eks-cluster-by-using-eksctl"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon EKS クラスターを作成します。 | 2 つの t2.small Amazon EC2 インスタンスをノードとして使用する Amazon EKS クラスターを作成するには、以下のコマンドを実行します。<pre>eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small</pre>このプロセスには 15～20 分かかる場合があります。クラスターが作成されると、適切な Kubernetes 設定が [kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html) ファイルに追加されます。`kubeconfig` ファイルを `kubectl`** ** と併用して、後の手順でアプリケーションをデプロイできます。 | 開発者、システム管理者 | 
| Amazon EKS クラスターを検証します。 | クラスターが作成され、接続できることを確認するには、`kubectl get nodes` コマンドを実行します。 | 開発者、システム管理者 | 

### Amazon ECR リポジトリを作成して Docker イメージをプッシュします。
<a name="create-an-amazon-ecr-repository-and-push-the-docker-image"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon ECR リポジトリを作成します。 | Amazon ECR ドキュメントの [プライベートリポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)の指示に従います。 | 開発者、システム管理者 | 
| POM XML ファイルを作成します。 | このパターンの[追加情報](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)セクションの *POM ファイル例*のコードに基づき、`pom.xml` ファイルを作成します。 | 開発者、システム管理者 | 
| ソースファイルを作成します。 | 次の例に基づいて、`src/main/java/eksExample` パスの `HelloWorld.java` というソースファイルを作成します。<pre>package eksExample;<br />import static spark.Spark.get;<br /><br />public class HelloWorld {<br />    public static void main(String[] args) {<br />        get("/", (req, res) -> {<br />            return "Hello World!";<br />        });<br />    }<br />}</pre>以下のディレクトリ構造を使用してください。<pre>├── Dockerfile<br />├── deployment.yaml<br />├── ingress.yaml<br />├── pom.xml<br />├── service.yaml<br />└── src<br />    └── main<br />        └── java<br />            └── eksExample<br />                └── HelloWorld.java</pre> |  | 
| Dockerfile を作成します。 | このパターンの[追加情報](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)セクションにある *Dockerfile 例*のコードに基づき、`Dockerfile` を作成します。 | 開発者、システム管理者 | 
| Docker イメージをビルドおよびプッシュします。 | お使いの `Dockerfile` がイメージをビルド、タグ付け、Amazon ECR にプッシュするディレクトリで、以下のコマンドを実行します。<pre>aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com<br />docker buildx build --platform linux/amd64 -t hello-world-java:v1 .<br />docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1<br />docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1</pre>上のコマンドで AWS リージョン、アカウント番号、リポジトリの詳細を変更します。後で使用できるように、画像の URL をメモしておきます。M1 チップを搭載した macOS システムでは、AMD64 プラットフォームで実行中の Amazon EKS と互換性があるイメージの作成に問題があります。この問題を解決するには、[docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) を使用して Amazon EKS で動作する Docker イメージをビルドします。 |  | 

### Java マイクロサービスをデプロイする
<a name="deploy-the-java-microservices"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  デプロイファイルを作成します。 | このパターンの[追加情報](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)セクションにある*サンプルデプロイファイル*のコードに基づき、 `deployment.yaml` という YAML ファイルを作成します。先ほどコピーしたイメージの URL を Amazon ECR リポジトリのイメージファイルのパスとして使用します。 | 開発者、システム管理者 | 
| Java マイクロサービスを Amazon EKS クラスターにデプロイします。 | Amazon EKS クラスターにデプロイを作成するには、`kubectl apply -f deployment.yaml` コマンドを実行します。 | 開発者、システム管理者 | 
| ポッドのステータスを確認します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開発者、システム管理者 | 
| サービスを作成します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開発者、システム管理者 | 
| AWS Load Balancer Controller アドオンをインストールします。 | Amazon EKS ドキュメントの [AWS Load Balancer Controller のアドオンのインストール](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)の指示に従います。Kubernetes サービスの Application Load Balancer または Network Load Balancer を作成するには、アドオンがインストールされている必要があります。 | 開発者、システム管理者 | 
| Ingress リソースを作成します。 | このパターンの[追加情報](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)セクションにある *サンプル Ingress リソースファイル*のコードに基づき、 `ingress.yaml` という YAML ファイルを作成します。 | 開発者、システム管理者 | 
| Application Load Balancer を作成します。 | Ingress リソースをデプロイしてApplication Load Balancer を作成するには、`kubectl apply -f ingress.yaml` コマンドを実行します。 | 開発者、システム管理者 | 

### アプリケーションをテストする
<a name="test-the-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| アプリケーションをテストおよび検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開発者、システム管理者 | 

## 関連リソース
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-resources"></a>
+ [プライベートリポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)(Amazon ECR ドキュメント)
+ [Docker イメージのプッシュ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)(Amazon ECR ドキュメント)
+ [Ingress Controllers](https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/)(Amazon EKS ワークショップ)
+ [Docker Buildx](https://docs.docker.com/engine/reference/commandline/buildx/)(Docker ドキュメント)

## 追加情報
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional"></a>

**サンプル POM ファイル**

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>


  <groupId>helloWorld</groupId>
  <artifactId>helloWorld</artifactId>
  <version>1.0-SNAPSHOT</version>


  <dependencies>
    <dependency>
      <groupId>com.sparkjava</groupId><artifactId>spark-core</artifactId><version>2.0.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version>
        <configuration><finalName>eksExample</finalName><archive><manifest>
              <addClasspath>true</addClasspath><mainClass>eksExample.HelloWorld</mainClass><classpathPrefix>dependency-jars/</classpathPrefix>
            </manifest></archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version>
        <configuration><source>1.8</source><target>1.8</target></configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <goals><goal>attached</goal></goals><phase>package</phase>
            <configuration>
              <finalName>eksExample</finalName>
              <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>
              <archive><manifest><mainClass>eksExample.HelloWorld</mainClass></manifest></archive>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
```

**サンプル Dockerfile**

```
FROM bellsoft/liberica-openjdk-alpine-musl:17

RUN apk add maven
WORKDIR /code

# Prepare by downloading dependencies
ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]

# Adding source, compile and package into a fat jar
ADD src /code/src
RUN ["mvn", "package"]

EXPOSE 4567
CMD ["java", "-jar", "target/eksExample-jar-with-dependencies.jar"]
```

**サンプルデプロイファイル**

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservice-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: java-microservice
  template:
    metadata:
      labels:
        app.kubernetes.io/name: java-microservice
    spec:
      containers:
      - name: java-microservice-container
        image: .dkr.ecr.amazonaws.com/:
        ports:
        - containerPort: 4567
```

**サンプルサービスファイル**

```
apiVersion: v1
kind: Service
metadata:
  name: "service-java-microservice"
spec:
  ports:
    - port: 80
      targetPort: 4567
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: java-microservice
```

**サンプル Ingress リソースファイル**

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "java-microservice-ingress"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/load-balancer-name: apg2
    alb.ingress.kubernetes.io/target-type: ip
  labels:
    app: java-microservice
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "service-java-microservice"
                port:
                  number: 80
```