기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
를 사용하여 사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 알아봅니다. AWS CLI
이 자습서에서는 사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 보여줍니다. 를 사용하여 사용자 지정 속성을 사용하여 리소스를 동적으로 AWS Cloud Map 검색하는 마이크로서비스 애플리케이션을 생성합니다. 애플리케이션은 DynamoDB 테이블에 데이터를 쓰고 DynamoDB 테이블에서 읽는 두 Lambda 함수로 구성되며, 모든 리소스는에 등록됩니다 AWS Cloud Map.
자습서 AWS Management 콘솔 버전은 단원을 참조하십시오사용자 지정 속성과 함께 AWS Cloud Map 서비스 검색을 사용하는 방법을 알아봅니다..
사전 조건
이 자습서를 시작하기 전에의 단계를 완료합니다를 사용하도록 설정 AWS Cloud Map.
AWS Cloud Map 네임스페이스 생성
네임스페이스는 애플리케이션의 서비스를 그룹화하는 데 사용되는 구문입니다. 이 단계에서는 AWS Cloud Map API 호출을 통해 리소스를 검색할 수 있는 네임스페이스를 생성합니다.
-
다음 명령을 실행하여 HTTP 네임스페이스를 생성합니다.
aws servicediscovery create-http-namespace \ --name cloudmap-tutorial \ --creator-request-id cloudmap-tutorial-request명령은 작업 ID를 반환합니다. 다음 명령을 사용하여 작업 상태를 확인할 수 있습니다.
aws servicediscovery get-operation \ --operation-id operation-id -
네임스페이스가 생성되면 후속 명령에 사용할 네임스페이스의 ID를 검색할 수 있습니다.
aws servicediscovery list-namespaces \ --query "Namespaces[?Name=='cloudmap-tutorial'].Id" \ --output text -
나중에 사용할 수 있도록 네임스페이스 ID를 변수에 저장합니다.
NAMESPACE_ID=$(aws servicediscovery list-namespaces \ --query "Namespaces[?Name=='cloudmap-tutorial'].Id" \ --output text)
DynamoDB 테이블 생성
그런 다음 애플리케이션에 대한 데이터를 저장할 DynamoDB 테이블을 생성합니다.
-
다음 명령을 실행하여 테이블을 생성합니다.
aws dynamodb create-table \ --table-name cloudmap \ --attribute-definitions AttributeName=id,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH \ --billing-mode PAY_PER_REQUEST -
계속하기 전에 테이블이 활성화될 때까지 기다립니다.
aws dynamodb wait table-exists --table-name cloudmap이 명령은 테이블이 완전히 생성되고 사용할 준비가 될 때까지 기다립니다.
AWS Cloud Map 데이터 서비스 생성 및 DynamoDB 테이블 등록
이제 네임스페이스에서 데이터 스토리지 리소스를 나타내는 서비스를 생성합니다.
-
다음 명령을 실행하여 데이터 스토리지 리소스에 대한 AWS Cloud Map 서비스를 생성합니다.
aws servicediscovery create-service \ --name data-service \ --namespace-id $NAMESPACE_ID \ --creator-request-id data-service-request -
데이터 서비스의 서비스 ID를 가져옵니다.
DATA_SERVICE_ID=$(aws servicediscovery list-services \ --query "Services[?Name=='data-service'].Id" \ --output text) -
테이블 이름을 지정하는 사용자 지정 속성을 사용하여 DynamoDB 테이블을 서비스 인스턴스로 등록합니다.
aws servicediscovery register-instance \ --service-id $DATA_SERVICE_ID \ --instance-id data-instance \ --attributes tablename=cloudmap사용자 지정 속성을
tablename=cloudmap사용하면 다른 서비스에서 DynamoDB 테이블 이름을 동적으로 검색할 수 있습니다.
Lambda 함수에 대한 IAM 역할 생성
Lambda 함수가 리소스에 액세스하는 AWS 데 사용할 IAM 역할을 생성합니다.
-
다음 JSON을 사용하여 IAM 역할에 대한 신뢰 정책 문서를 생성합니다.
-
다음 명령을 실행하여 신뢰 정책을 사용하여 IAM 역할을 생성합니다.
aws iam create-role \ --role-name cloudmap-tutorial-role \ --assume-role-policy-document file://lambda-trust-policy.json -
다음 JSON을 사용하여 최소 권한 권한이 있는 사용자 지정 IAM 정책에 대한 파일을 생성합니다.
-
정책을 생성하고 IAM 역할에 연결합니다.
aws iam create-policy \ --policy-name CloudMapTutorialPolicy \ --policy-document file://cloudmap-policy.json POLICY_ARN=$(aws iam list-policies \ --query "Policies[?PolicyName=='CloudMapTutorialPolicy'].Arn" \ --output text) aws iam attach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn $POLICY_ARN aws iam attach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Lambda 함수를 생성하여 데이터 쓰기
DynamoDB 테이블에 데이터를 쓰는 Lambda 함수를 생성하려면 다음 단계를 따르세요.
-
쓰기 함수에 대한 Python 파일을 생성합니다.
cat > writefunction.py << EOF import json import boto3 import random def lambda_handler(event, context): try: serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='data-service') if not response.get("Instances"): return { 'statusCode': 500, 'body': json.dumps({"error": "No instances found"}) } tablename = response["Instances"][0]["Attributes"].get("tablename") if not tablename: return { 'statusCode': 500, 'body': json.dumps({"error": "Table name attribute not found"}) } dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) # Validate input if not isinstance(event, str): return { 'statusCode': 400, 'body': json.dumps({"error": "Input must be a string"}) } response = table.put_item( Item={ 'id': str(random.randint(1,100)), 'todo': event }) return { 'statusCode': 200, 'body': json.dumps(response) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({"error": str(e)}) } EOF이 함수는 AWS Cloud Map 를 사용하여 사용자 지정 속성에서 DynamoDB 테이블 이름을 검색한 다음 테이블에 데이터를 씁니다.
-
Lambda 함수를 패키징하고 배포합니다.
zip writefunction.zip writefunction.py ROLE_ARN=$(aws iam get-role --role-name cloudmap-tutorial-role \ --query 'Role.Arn' --output text) aws lambda create-function \ --function-name writefunction \ --runtime python3.12 \ --role $ROLE_ARN \ --handler writefunction.lambda_handler \ --zip-file fileb://writefunction.zip \ --architectures x86_64 -
제한 시간 오류를 방지하려면 함수 제한 시간을 업데이트합니다.
aws lambda update-function-configuration \ --function-name writefunction \ --timeout 5
AWS Cloud Map 앱 서비스 생성 및 Lambda 쓰기 함수 등록
네임스페이스에 애플리케이션 함수를 나타내는 다른 서비스를 생성하려면 다음 단계를 따르세요.
-
애플리케이션 함수에 대한 서비스를 생성합니다.
aws servicediscovery create-service \ --name app-service \ --namespace-id $NAMESPACE_ID \ --creator-request-id app-service-request -
앱 서비스의 서비스 ID를 가져옵니다.
APP_SERVICE_ID=$(aws servicediscovery list-services \ --query "Services[?Name=='app-service'].Id" \ --output text) -
Lambda 쓰기 함수를 사용자 지정 속성이 있는 서비스 인스턴스로 등록합니다.
aws servicediscovery register-instance \ --service-id $APP_SERVICE_ID \ --instance-id write-instance \ --attributes action=write,functionname=writefunction사용자 지정 속성
action=write및를functionname=writefunction사용하면 클라이언트가 목적에 따라이 함수를 검색할 수 있습니다.
Lambda 함수를 생성하여 데이터 읽기
DynamoDB 테이블에서 데이터를 읽는 Lambda 함수를 생성하려면 다음 단계를 따릅니다.
-
읽기 함수에 대한 Python 파일을 생성합니다.
cat > readfunction.py << EOF import json import boto3 def lambda_handler(event, context): try: serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='data-service') if not response.get("Instances"): return { 'statusCode': 500, 'body': json.dumps({"error": "No instances found"}) } tablename = response["Instances"][0]["Attributes"].get("tablename") if not tablename: return { 'statusCode': 500, 'body': json.dumps({"error": "Table name attribute not found"}) } dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) # Use pagination for larger tables response = table.scan( Select='ALL_ATTRIBUTES', Limit=50 # Limit results for demonstration purposes ) # For production, you would implement pagination like this: # items = [] # while 'LastEvaluatedKey' in response: # items.extend(response['Items']) # response = table.scan( # Select='ALL_ATTRIBUTES', # ExclusiveStartKey=response['LastEvaluatedKey'] # ) # items.extend(response['Items']) return { 'statusCode': 200, 'body': json.dumps(response) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({"error": str(e)}) } EOF또한이 함수는 AWS Cloud Map 를 사용하여 DynamoDB 테이블 이름을 검색한 다음 테이블에서 데이터를 읽습니다. 여기에는 오류 처리 및 페이지 매김 주석이 포함됩니다.
-
Lambda 함수를 패키징하고 배포합니다.
zip readfunction.zip readfunction.py aws lambda create-function \ --function-name readfunction \ --runtime python3.12 \ --role $ROLE_ARN \ --handler readfunction.lambda_handler \ --zip-file fileb://readfunction.zip \ --architectures x86_64 -
함수 제한 시간을 업데이트합니다.
aws lambda update-function-configuration \ --function-name readfunction \ --timeout 5
Lambda 읽기 함수를 서비스 인스턴스로 등록
Lambda 읽기 함수를 앱 서비스의 다른 서비스 인스턴스로 등록하려면 다음 단계를 따릅니다.
aws servicediscovery register-instance \ --service-id $APP_SERVICE_ID \ --instance-id read-instance \ --attributes action=read,functionname=readfunction
사용자 지정 속성 action=read 및를 functionname=readfunction 사용하면 클라이언트가 목적에 따라이 함수를 검색할 수 있습니다.
클라이언트 애플리케이션 생성 및 실행
가 쓰기 함수를 검색하고 호출하는 AWS Cloud Map 데 사용하는 Python 클라이언트 애플리케이션을 생성하려면 다음 단계를 따르세요.
-
쓰기 클라이언트 애플리케이션을 위한 Python 파일을 생성합니다.
cat > writeclient.py << EOF import boto3 import json try: serviceclient = boto3.client('servicediscovery') print("Discovering write function...") response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'write' } ) if not response.get("Instances"): print("Error: No instances found") exit(1) functionname = response["Instances"][0]["Attributes"].get("functionname") if not functionname: print("Error: Function name attribute not found") exit(1) print(f"Found function: {functionname}") lambdaclient = boto3.client('lambda') print("Invoking Lambda function...") resp = lambdaclient.invoke( FunctionName=functionname, Payload='"This is a test data"' ) payload = resp["Payload"].read() print(f"Response: {payload.decode('utf-8')}") except Exception as e: print(f"Error: {str(e)}") EOF이 클라이언트는
QueryParameters옵션을 사용하여action=write속성이 있는 서비스 인스턴스를 찾습니다. -
읽기 클라이언트 애플리케이션을 위한 Python 파일을 생성합니다.
cat > readclient.py << EOF import boto3 import json try: serviceclient = boto3.client('servicediscovery') print("Discovering read function...") response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'read' } ) if not response.get("Instances"): print("Error: No instances found") exit(1) functionname = response["Instances"][0]["Attributes"].get("functionname") if not functionname: print("Error: Function name attribute not found") exit(1) print(f"Found function: {functionname}") lambdaclient = boto3.client('lambda') print("Invoking Lambda function...") resp = lambdaclient.invoke( FunctionName=functionname, InvocationType='RequestResponse' ) payload = resp["Payload"].read() print(f"Response: {payload.decode('utf-8')}") except Exception as e: print(f"Error: {str(e)}") EOF -
쓰기 클라이언트를 실행하여 DynamoDB 테이블에 데이터를 추가합니다.
python3 writeclient.py출력에는 HTTP 상태 코드 200으로 성공적인 응답이 표시되어야 합니다.
-
읽기 클라이언트를 실행하여 DynamoDB 테이블에서 데이터를 검색합니다.
python3 readclient.py출력에는 임의로 생성된 ID와 "테스트 데이터입니다" 값을 포함하여 테이블에 기록된 데이터가 표시되어야 합니다.
리소스 정리
자습서를 마치면 추가 요금이 발생하지 않도록 리소스를 정리합니다.
-
먼저 다음 명령을 실행하여 서비스 인스턴스의 등록을 취소합니다.
aws servicediscovery deregister-instance \ --service-id $APP_SERVICE_ID \ --instance-id read-instance aws servicediscovery deregister-instance \ --service-id $APP_SERVICE_ID \ --instance-id write-instance aws servicediscovery deregister-instance \ --service-id $DATA_SERVICE_ID \ --instance-id data-instance -
다음 명령을 실행하여 서비스를 삭제합니다.
aws servicediscovery delete-service \ --id $APP_SERVICE_ID aws servicediscovery delete-service \ --id $DATA_SERVICE_ID -
다음 명령을 실행하여 네임스페이스를 삭제합니다.
aws servicediscovery delete-namespace \ --id $NAMESPACE_ID -
다음 명령을 실행하여 Lambda 함수를 삭제합니다.
aws lambda delete-function --function-name writefunction aws lambda delete-function --function-name readfunction -
다음 명령을 실행하여 IAM 역할 및 정책을 삭제합니다.
aws iam detach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn $POLICY_ARN aws iam detach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-policy \ --policy-arn $POLICY_ARN aws iam delete-role --role-name cloudmap-tutorial-role -
다음 명령을 실행하여 DynamoDB 테이블을 삭제합니다.
aws dynamodb delete-table --table-name cloudmap -
다음 명령을 실행하여 임시 파일을 정리합니다.
rm -f lambda-trust-policy.json cloudmap-policy.json writefunction.py readfunction.py writefunction.zip readfunction.zip writeclient.py readclient.py