

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 알아봅니다.
<a name="tutorial-microservices"></a>

다음 자습서에서는 AWS Cloud Map API를 사용하여 검색할 수 있는 사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 보여줍니다. 이 자습서에서는를 사용하여 클라이언트 애플리케이션을 생성하고 실행하는 방법을 안내합니다 AWS CloudShell. 애플리케이션은 두 Lambda 함수를 사용하여 DynamoDB 테이블에 데이터를 쓴 다음 테이블에서 읽습니다. Lambda 함수 및 DynamoDB 테이블은에 서비스 인스턴스 AWS Cloud Map 로 등록됩니다. 클라이언트 애플리케이션 및 Lambda 함수의 코드는 사용자 지정 속성을 사용하여 AWS Cloud Map 작업을 수행하는 데 필요한 리소스를 검색합니다.

이 자습서의 AWS CLI기반 버전은 섹션을 참조하세요[를 사용하여 사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 알아봅니다. AWS CLI](tutorial-microservices-cli.md).

**중요**  
워크숍 중에 계정에 AWS 비용이 발생하는 AWS 리소스를 생성합니다. 워크숍을 마치는 즉시 리소스를 정리하여 비용을 최소화하는 것이 좋습니다.

## 사전 조건
<a name="tutorial-customattributes-prerequisites"></a>

시작하기 전에 [를 사용하도록 설정 AWS Cloud Map](setting-up-cloud-map.md)의 단계를 완료해야 합니다.

## 1단계: AWS Cloud Map 네임스페이스 생성
<a name="tutorial-customattributes-step1"></a>

이 단계에서는 AWS Cloud Map 네임스페이스를 생성합니다. 네임스페이스는 애플리케이션의 서비스를 그룹화하는 데 사용되는 구문입니다. 네임스페이스를 생성할 때 리소스를 검색할 수 있는 방법을 지정합니다. 이 단계에서 생성된 네임스페이스에 생성된 리소스는 사용자 지정 속성을 사용하여 AWS Cloud Map API 직접 호출을 통해 검색할 수 있습니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) AWS Cloud Map 콘솔을 엽니다.

1. **Create namespace(네임스페이스 생성)**를 선택합니다.

1. **네임스페이스 이름**에를 지정합니다`cloudmap-tutorial`.

1. (선택 사항) **네임스페이스 설명**에서 네임스페이스를 사용할 대상에 대한 설명을 지정합니다.

1. **인스턴스 검색에서** **API 호출**을 선택합니다.

1. 나머지 기본값을 그대로 두고 **네임스페이스 생성을** 선택합니다.

## 2단계: DynamoDB 테이블 생성
<a name="tutorial-customattributes-step2"></a>

이 단계에서는 DynamoDB 테이블을 생성합니다. 이 테이블은 다음 단계에서 생성할 샘플 애플리케이션의 데이터를 저장하고 검색하는 데 사용됩니다.

DynamoDB를 생성하는 방법에 대한 자세한 내용은 [ DynamoDB 개발자 안내서의 1단계: DynamoDB에서 테이블 생성을](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) 참조하고 다음 표를 사용하여 지정할 옵션을 결정합니다. *DynamoDB * 


| 옵션 | 값 | 
| --- | --- | 
| 테이블 이름 | 클라우드맵 | 
| 파티션 키 | id | 

나머지 설정의 기본값을 유지하고 테이블을 생성합니다.

## 3단계: AWS Cloud Map 데이터 서비스 생성 및 DynamoDB 테이블을 인스턴스로 등록
<a name="tutorial-customattributes-step3"></a>

이 단계에서는 AWS Cloud Map 서비스를 생성한 다음 마지막 단계에서 생성한 DynamoDB 테이블을 서비스 인스턴스로 등록합니다.

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) AWS Cloud Map 콘솔을 엽니다.

1. 네임스페이스 목록에서 네임`cloudmap-tutorial`스페이스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스** 섹션에서 **서비스 생성을** 선택하고 다음을 수행합니다.

   1. **서비스 이름**에 `data-service`를 입력합니다.

   1. 나머지 기본값을 그대로 두고 **서비스 생성을** 선택합니다.

1. **서비스** 섹션에서 `data-service` 서비스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스 인스턴스** 섹션에서 **서비스 인스턴스 등록**을 선택합니다.

1. **서비스 인스턴스 등록** 페이지에서 다음을 수행합니다.

   1. **인스턴스 유형**에서 **다른 리소스에 대한 식별 정보를** 선택합니다.

   1. **서비스 인스턴스 ID**에를 지정합니다`data-instance`.

   1. **사용자 지정 속성** 섹션에서 키-값 페어를 지정합니다. **키** = `tablename`, **값** = `cloudmap`.

## 4단계: AWS Lambda 실행 역할 생성
<a name="tutorial-customattributes-step4"></a>

이 단계에서는 다음 단계에서 AWS Lambda 함수가 사용하는 IAM 역할을 생성합니다. 역할이이 자습서에만 사용되고 나중에 삭제할 수 있으므로 IAM 역할의 이름을 `cloudmap-tutorial-role` 지정하고 권한 경계를 생략할 수 있습니다.

**Lambda에 대한 서비스 역할을 생성하려면(IAM 콘솔)**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. IAM 콘솔의 탐색 창에서 **역할**을 선택하고 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다.

1. **서비스 또는 사용 사례**에서 **Lambda**를 선택한 다음 **Lambda** 사용 사례를 선택합니다.

1. **다음**을 선택합니다.

1. `PowerUserAccess` 정책을 검색하고 옆에 있는 상자를 선택한 **후 다음을** 선택합니다.

1. **다음**을 선택합니다.

1. **역할 이름**에를 지정합니다`cloudmap-tutorial-role`.

1. 역할을 검토한 다음 **역할 생성**을 선택합니다.

## 5단계: Lambda 함수를 생성하여 데이터 쓰기
<a name="tutorial-customattributes-step5"></a>

이 단계에서는 AWS Cloud Map API를 사용하여 생성한 AWS Cloud Map 서비스를 쿼리하여 DynamoDB 테이블에 데이터를 쓰는 Lambda 함수를 처음부터 생성합니다.

Lambda 함수 생성에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [콘솔을 사용하여 Lambda 함수 생성을](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) 참조하고 다음 표를 사용하여 지정하거나 선택할 옵션을 결정합니다.


| 옵션 | 값 | 
| --- | --- | 
| 함수 이름 | writefunction | 
| 런타임 | Python 3.12 | 
| 아키텍처 | x86\_64 | 
| 권한 | 기존 역할 사용 | 
| 기존 역할 | cloudmap-tutorial-role | 

함수를 생성한 후 다음 Python 코드를 반영하도록 예제 코드를 업데이트한 다음 함수를 배포합니다. DynamoDB 테이블에 대해 생성한 AWS Cloud Map 서비스 인스턴스와 연결한 `datatable` 사용자 지정 속성을 지정합니다. 함수는 1에서 100 사이의 임의의 숫자인 키를 생성하고 호출 시 함수에 전달되는 값과 연결합니다.

```
import json
import boto3
import random

def lambda_handler(event, context):
       
    serviceclient = boto3.client('servicediscovery')
    
    response = serviceclient.discover_instances(
        NamespaceName='cloudmap-tutorial',
        ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.put_item(
        Item={ 'id': str(random.randint(1,100)), 'todo': event })
       
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

함수를 배포한 후 제한 시간 오류를 방지하려면 함수 제한 시간을 5초로 업데이트합니다. 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 함수 제한 시간 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)을 참조하세요.

## 6단계: AWS Cloud Map 앱 서비스 생성 및 Lambda 쓰기 함수를 인스턴스로 등록
<a name="tutorial-customattributes-step6"></a>

이 단계에서는 AWS Cloud Map 서비스를 생성한 다음 Lambda 쓰기 함수를 서비스 인스턴스로 등록합니다.

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) AWS Cloud Map 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **네임스페이스를** 선택합니다.

1. 네임스페이스 목록에서 네임`cloudmap-tutorial`스페이스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스** 섹션에서 **서비스 생성을** 선택하고 다음을 수행합니다.

   1. **서비스 이름**에 `app-service`를 입력합니다.

   1. 나머지 기본값을 그대로 두고 **서비스 생성을** 선택합니다.

1. **서비스** 섹션에서 `app-service` 서비스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스 인스턴스** 섹션에서 **서비스 인스턴스 등록**을 선택합니다.

1. **서비스 인스턴스 등록** 페이지에서 다음을 수행합니다.

   1. **인스턴스 유형**에서 **다른 리소스에 대한 식별 정보를** 선택합니다.

   1. **서비스 인스턴스 ID**에를 지정합니다`write-instance`.

   1. **사용자 지정 속성** 섹션에서 다음 키-값 페어를 지정합니다.
      + **키** = `action`, **값** = `write`
      + **키** = `functionname`, **값** = `writefunction`

## 7단계: Lambda 함수를 생성하여 데이터 읽기
<a name="tutorial-customattributes-step7"></a>

이 단계에서는 생성한 DynamoDB 테이블에 데이터를 쓰는 Lambda 함수를 처음부터 생성합니다.

Lambda 함수 생성에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [콘솔을 사용하여 Lambda 함수 생성을](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) 참조하고 다음 표를 사용하여 지정하거나 선택할 옵션을 결정합니다.


| 옵션 | 값 | 
| --- | --- | 
| 함수 이름 | 읽기 함수 | 
| 런타임 | Python 3.12 | 
| 아키텍처 | x86\_64 | 
| 권한 | 기존 역할 사용 | 
| 기존 역할 | cloudmap-tutorial-role | 

함수를 생성한 후 다음 Python 코드를 반영하도록 예제 코드를 업데이트한 다음 함수를 배포합니다. 함수는 테이블 amd를 스캔하여 모든 항목을 반환합니다.

```
import json
import boto3

def lambda_handler(event, context):
    serviceclient = boto3.client('servicediscovery')

    response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.scan(Select='ALL_ATTRIBUTES')

    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

함수를 배포한 후 제한 시간 오류를 방지하려면 함수 제한 시간을 5초로 업데이트합니다. 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 함수 제한 시간 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)을 참조하세요.

## 8단계: Lambda 읽기 함수를 AWS Cloud Map 서비스 인스턴스로 등록
<a name="tutorial-customattributes-step8"></a>

이 단계에서는 Lambda 읽기 함수를 이전에 생성한 서비스의 `app-service` 서비스 인스턴스로 등록합니다.

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) AWS Cloud Map 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **네임스페이스를** 선택합니다.

1. 네임스페이스 목록에서 네임`cloudmap-tutorial`스페이스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스** 섹션에서 `app-service` 서비스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스 인스턴스** 섹션에서 **서비스 인스턴스 등록**을 선택합니다.

1. **서비스 인스턴스 등록** 페이지에서 다음을 수행합니다.

   1. **인스턴스 유형**에서 **다른 리소스에 대한 식별 정보를** 선택합니다.

   1. **서비스 인스턴스 ID**에를 지정합니다`read-instance`.

   1. **사용자 지정 속성** 섹션에서 다음 키-값 페어를 지정합니다.
      + **키** = `action`, **값** = `read`
      + **키** = `functionname`, **값** = `readfunction`

## 9단계:에서 읽기 및 쓰기 클라이언트 생성 및 실행 AWS CloudShell
<a name="tutorial-customattributes-step10"></a>

코드를 AWS CloudShell 사용하여에서 클라이언트 애플리케이션을 생성하고 실행하여에서 구성한 서비스를 검색 AWS Cloud Map 하고 이러한 서비스를 호출할 수 있습니다.

1. [https://console.aws.amazon.com/cloudshell/](https://console.aws.amazon.com/cloudshell/) AWS CloudShell 콘솔을 엽니다.

1. 다음 명령을 사용하여 라는 파일을 생성합니다`writefunction.py`.

   ```
   vim writeclient.py
   ```

1. `writeclient.py` 파일에서 `i` 버튼을 눌러 삽입 모드로 들어갑니다. 그런 다음 다음 코드를 복사하여 붙여 넣습니다. 이 코드는 `app-service` 서비스`name=writeservice`에서 사용자 지정 속성을 검색하여 데이터를 쓰는 Lambda 함수를 검색합니다. DynamoDB 테이블에 데이터를 쓰는 Lambda 함수의 이름이 반환됩니다. 그런 다음 Lambda 함수가 호출되어 테이블에 기록된 샘플 페이로드를 값으로 전달합니다.

   ```
   import boto3
   
   serviceclient = boto3.client('servicediscovery')
   
   response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'write' })
   
   functionname = response["Instances"][0]["Attributes"]["functionname"]
   
   lambdaclient = boto3.client('lambda')
   
   resp = lambdaclient.invoke(FunctionName=functionname, Payload='"This is a test data"')
   
   print(resp["Payload"].read())
   ```

1. 이스케이프 키를 누르고를 입력한 다음 Enter 키를 `:wq`눌러 파일을 저장하고 종료합니다.

1. 다음 명령을 사용하여 Python 코드를 실행합니다.

   ```
   python3 writeclient.py
   ```

   출력은 다음과 유사한 `200` 응답이어야 합니다.

   ```
   b'{"statusCode": 200, "body": "{\\"ResponseMetadata\\": {\\"RequestId\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Wed, 06 Mar 2024 22:46:09 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"2\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"2745614147\\"}, \\"RetryAttempts\\": 0}}"}'
   ```

1. 이전 단계에서 쓰기에 성공했는지 확인하려면 읽기 클라이언트를 생성합니다.

   1. 다음 명령을 사용하여 라는 파일을 생성합니다`readfunction.py`.

      ```
      vim readclient.py
      ```

   1. `readclient.py` 파일에서 `i` 버튼을 눌러 삽입 모드로 들어갑니다. 그런 다음 다음 코드를 복사하여 붙여 넣습니다. 이 코드는 테이블을 스캔하고 이전 단계에서 작성한 값을 테이블에 반환합니다.

      ```
      import boto3
      
      serviceclient = boto3.client('servicediscovery')
      
      response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'read' })
      
      functionname = response["Instances"][0]["Attributes"]["functionname"]
      
      lambdaclient = boto3.client('lambda')
      
      resp = lambdaclient.invoke(FunctionName=functionname, InvocationType='RequestResponse')
      
      print(resp["Payload"].read())
      ```

   1. 이스케이프 키를 누르고를 입력한 다음 Enter 키를 `:wq`눌러 파일을 저장하고 종료합니다.

   1. 다음 명령을 사용하여 Python 코드를 실행합니다.

      ```
      python3 readclient.py
      ```

      출력은 다음과 비슷해야 하며,를 실행하여 테이블에 기록된 값과 Lambda 쓰기 함수에서 생성된 `writefunction.py` 임의 키를 나열합니다.

      ```
        b'{"statusCode": 200, "body": "{\\"Items\\": [{\\"id\\": \\"45\\", \\"todo\\": \\"This is a test data\\"}], \\"Count\\": 1, \\"ScannedCount\\": 1, \\"ResponseMetadata\\": {\\"RequestId\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Thu, 25 Jul 2024 20:43:33 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"91\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"1163081893\\"}, \\"RetryAttempts\\": 0}}"}'
      ```

## 10단계: 리소스 정리
<a name="tutorial-customattributes-step11"></a>

자습서를 완료한 후 추가 요금이 발생하지 않도록 리소스를 삭제합니다. AWS Cloud Map 에서는 먼저 서비스 인스턴스, 서비스, 마지막으로 네임스페이스를 역순으로 정리해야 합니다. 다음 단계에서는 자습서에 사용된 AWS Cloud Map 리소스를 정리하는 방법을 안내합니다.

**AWS Cloud Map 리소스를 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) AWS Cloud Map 콘솔을 엽니다.

1. 네임스페이스 목록에서 네임`cloudmap-tutorial`스페이스를 선택하고 **세부 정보 보기를** 선택합니다.

1. 네임스페이스 세부 정보 페이지의 서비스 목록에서 `data-service` 서비스를 선택하고 **세부 정보 보기를** 선택합니다.

1. **서비스 인스턴스** 섹션에서 `data-instance` 인스턴스를 선택하고 **등록 취소**를 선택합니다.

1. 페이지 상단의 브레드크럼을 사용하여 **cloudmap-tutorial.com** 선택하여 네임스페이스 세부 정보 페이지로 돌아갑니다.

1. 네임스페이스 세부 정보 페이지의 서비스 목록에서 **데이터 서비스** 서비스를 선택하고 **삭제**를 선택합니다.

1. 서비스 및 `write-instance` 및 `app-service` 서비스 `read-instance` 인스턴스에 대해 3\~6단계를 반복합니다.

1. 왼쪽 탐색 창에서 **네임스페이스를** 선택합니다.

1. `cloudmap-tutorial` 네임스페이스를 선택하고 **삭제**를 선택합니다.

다음 표에는 자습서에서 사용되는 다른 리소스를 삭제하기 위해 따를 수 있는 절차가 나열되어 있습니다.


| Resource | 단계(Steps) | 
| --- | --- | 
| DynamoDB 테이블 | [6단계: (선택 사항) Amazon DynamoDB 개발자 안내서의 DynamoDB 테이블을 삭제하여 리소스 정리](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-6.html)  DynamoDB  | 
| Lambda 함수 및 관련 IAM 실행 역할 | *AWS Lambda 개발자 안내서*의 [정리](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#gettingstarted-cleanup)  | 