# Product Catalog App 배포

AWS App Mesh를 이해하려면 위에서 실행되는 모든 애플리케이션을 이해하는 것이 가장 좋습니다. 이 실습에서는 애플리케이션 설정 및 배포의 다음 부분에 대해 설명합니다.

* 애플리케이션 아키텍처에 대해 설명합니다.
* Application Services 컨테이너 이미지를 작성합니다.&#x20;
* 컨테이너 이미지를 Amazon ECR에 푸시합니다.&#x20;
* 처음에는 AWS 앱 메시 없이 Amazon EKS 클러스터에 애플리케이션 서비스를 배포합니다.&#x20;
* 서비스 간의 연결을 테스트합니다.

## 1. Application Architecture

App Mesh를 생성하는 과정을 안내할 애플리케이션 아키텍처의 예는 `Product Catalog`라고 하며 모든 eCommerce 애플리케이션에 사용됩니다. 이 애플리케이션은 세 가지 마이크로 서비스로 구성됩니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FEAFbNrVhwkLhQooRRQqA%2Fimage.png?alt=media\&token=04c86726-defd-4c5c-8e49-be80fa11e3cd)

**프런트엔드**

* 프런트엔드 서비스 `frontend-node` 는 제품 카탈로그 기능에 대한 UI를 보여줍니다.&#x20;
* ejs 템플레이팅과 함께 Nodejs에서 개발되었습니다.&#x20;
* EKS 관리 노드 그룹에 배포되었습니다.

**제품 카탈로그 백엔드**

* 백엔드 서비스 `prodcatalog`는 다음 작업을 수행하는 REST API 서비스입니다.&#x20;
  * 제품 카탈로그에 제품을 추가합니다.&#x20;
  * 제품 카탈로그에서 제품을 가져옵니다.&#x20;
  * 카탈로그 세부 정보 백엔드 서비스 `proddetail`를 호출하여 벤더와 같은 제품 카탈로그 세부 정보를 가져옵니다.&#x20;
  * 제품 카탈로그에서 모든 제품을 가져옵니다.
* Python Fask Restplus와 Rest API용 Swagger UI가 함께 제공됩니다.&#x20;
* EKS 파게이트에 배치되었습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2Fe3VJoGaYQIws59zEPCCE%2Fimage.png?alt=media\&token=db3015d8-15fe-4e9a-b3cf-f13281fc4230)

**Catalog Detail 백엔드**

* 백엔드 서비스 `proddetail`은 다음 작업을 수행하는 REST API 서비스입니다.&#x20;
  * 버전 번호 및 공급업체 이름이 포함된 카탈로그 세부 정보를 가져옵니다.
* Nodejs로 배포됩니다.
* EKS 관리 노드 그룹에 배포되었습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FcD0duNfTtqIwy2VhFgIQ%2Fimage.png?alt=media\&token=c12942f8-10d9-4329-b2e3-ceb378b41eea)

위의 다이어그램에서 `Product Catalog` 애플리케이션의 서비스 간 service-call 관계를 다음과 같이 요약할 수 있습니다. &#x20;

* Frontend `frontend-node` »»> calls »»> Product Catalog backend `prodcatalog`.
* Product Catalog backend `prodcatalog` »»> calls »»> Catalog Detail backend `proddetail`.

## 2. Catalog 애플리케이션 생성

3가지 서비스에 대한 Container 이미지를 빌드하여 ECR에 푸시합니다. (약 5분 소요됩니다.)

```
cd eks-app-mesh-polyglot-demo
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
PROJECT_NAME=eks-app-mesh-demo
export APP_VERSION=1.0
for app in catalog_detail product_catalog frontend_node; do
  aws ecr describe-repositories --repository-name $PROJECT_NAME/$app >/dev/null 2>&1 || \
  aws ecr create-repository --repository-name $PROJECT_NAME/$app >/dev/null
  TARGET=$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$PROJECT_NAME/$app:$APP_VERSION
  docker build -t $TARGET apps/$app
  docker push $TARGET
done

```

콘솔에서 ECR내의 이미지를 확인할 수 있습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FHN7bNcr0NLJEkpe03W1T%2Fimage.png?alt=media\&token=d8ff528d-c22b-4ba1-8d10-0b4616dc4a89)

애플리케이션을 EKS 클러스터에 배포합니다. (Fargate pod 가 생성되기 까지는 약 4분이 소요됩니다.)

```
envsubst < ./deployment/base_app.yaml | kubectl apply -f -
```

배포된 정보를 확인합니다.

```
kubectl get deployment,pods,svc -n prodcatalog-ns -o wide
```

Product Catalog 서비스는 Fargate에 배포되어야 하며(네임스페이스 `productlog-ns`, `label : app= productlog`) 백엔드와 Catalog Product Detail은 Mnaged Nodegroup에 배포됩니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FURH3d3CpOoUqTuHdw6qH%2Fimage.png?alt=media\&token=3f023dc7-240a-4ca2-b15e-6e4fc9007087)

fargate pod가 service account role을 사용하는지 확인합니다.

```
export BE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=prodcatalog -o jsonpath='{.items[].metadata.name}') 

kubectl describe pod ${BE_POD_NAME} -n  prodcatalog-ns | grep 'AWS_ROLE_ARN\|AWS_WEB_IDENTITY_TOKEN_FILE\|serviceaccount' 

```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FgBhIYnYzy3jPniMmNhM1%2Fimage.png?alt=media\&token=c6244fb7-0fe4-4d63-bdbe-b6d9c9a94203)

fargate pod 로깅이 활성화 되었는지 확인합니다.

```
kubectl describe pod ${BE_POD_NAME} -n  prodcatalog-ns | grep LoggingEnabled

```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2Fnm5Gv4gZ8tPxBqKXlBDu%2Fimage.png?alt=media\&token=cf51fbeb-a480-400c-9a25-f561c903c82f)

## 3. 애플리케이션 테스트

Fargate 와 Nodegroup 간에 연결을 확인하여 위해 `frontend-node` 컨테이너에 접속하여 `prodcatalog` 백엔트 서비스 엔드포인트를 호출합니다.

```
export FE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=frontend-node -o jsonpath='{.items[].metadata.name}') 

kubectl -n prodcatalog-ns exec -it ${FE_POD_NAME} -c frontend-node bash

```

```
curl http://prodcatalog.prodcatalog-ns.svc.cluster.local:5000/products/ 

```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FoIubdnmGCfb4SR9SPJK3%2Fimage.png?alt=media\&token=b3b892bb-0042-44f4-a7f3-40f5ad8c1de6)

이번에는 `prodcatalog`와 `proddetail` 간의 연결을 확인합니다. (ctrl+d 로 container에서 빠져나옵니다.)

```
export BE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=prodcatalog -o jsonpath='{.items[].metadata.name}') 

kubectl -n prodcatalog-ns exec -it ${BE_POD_NAME} -c prodcatalog bash

```

```
curl http://proddetail.prodcatalog-ns.svc.cluster.local:3000/catalogDetail

```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FPB8bVIVF9LORWksnCECW%2Fimage.png?alt=media\&token=61c13b0e-5cf2-498b-9fed-5a0d9b2c5d22)

