

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

# 프로젝트 정책(SDK) 연결
<a name="md-attach-project-policy"></a>

[PutProjectPolicy](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_PutProjectPolicy) 작업을 직접 호출하여 Amazon Rekognition Custom Labels 프로젝트에 프로젝트 정책을 연결합니다.

추가하려는 각 프로젝트 정책마다 `PutProjectPolicy`를 직접 호출하여 여러 프로젝트 정책을 프로젝트에 연결하세요. 최대 5개의 프로젝트 정책을 프로젝트에 연결할 수 있습니다. 더 많은 프로젝트 정책을 추가해야 하는 경우 [한도](limits.md) 증가를 요청할 수 있습니다.

고유한 프로젝트 정책을 프로젝트에 처음 첨부할 때는 `PolicyRevisionId` 입력 파라미터에 수정 ID를 지정하지 마세요. `PutProjectPolicy`의 응답은 Amazon Rekognition Custom Labels가 사용자를 위해 생성하는 프로젝트 정책의 수정 ID입니다. 수정 ID를 사용하여 프로젝트 정책의 최신 개정 버전을 업데이트하거나 삭제할 수 있습니다. Amazon Rekognition Custom Labels는 프로젝트 정책의 최신 개정 버전만 보관합니다. 프로젝트 정책의 이전 개정 버전을 업데이트하거나 삭제하려고 하면 `InvalidPolicyRevisionIdException` 오류가 발생합니다.

기존 프로젝트 정책을 업데이트하려면 `PolicyRevisionId` 입력 파라미터에 프로젝트 정책의 개정 ID를 지정합니다. [ListProjectPolicies](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_ListProjectPolicies)를 직접 호출하여 프로젝트의 프로젝트 정책에 대한 개정 ID를 가져올 수 있습니다.

프로젝트 정책을 소스 프로젝트에 연결한 후 소스 프로젝트에서 대상 프로젝트로 모델을 복사할 수 있습니다. 자세한 내용은 [모델 복사(SDK)](md-copy-model-sdk.md) 단원을 참조하십시오.

프로젝트에서 프로젝트 정책을 제거하려면 [DeleteProjectPolicy](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DeleteProjectPolicy)를 직접 호출하세요. 프로젝트에 첨부된 프로젝트 정책 목록을 가져오려면 [ListProjectPolicies](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_ListProjectPolicies)를 직접 호출하세요.

**프로젝트 정책을 프로젝트에 연결하려면(SDK)**

1. 아직 설치하지 않은 경우 및 AWS SDKs AWS CLI 를 설치하고 구성합니다. 자세한 내용은 [4단계: AWS CLI 및 AWS SDKs 설정](su-awscli-sdk.md) 단원을 참조하십시오.

1. [프로젝트 정책 문서를 생성합니다](md-create-project-policy-document.md).

1. 다음 코드를 사용하여 복사하려는 모델 버전이 포함된 신뢰할 수 있는 AWS 계정의 프로젝트에 프로젝트 정책을 연결합니다. 프로젝트 ARN을 가져오려면 [DescribeProjects](https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/md-describing-project-sdk.html)를 직접 호출하세요. 모델 버전 ARN을 가져오려면 [DescribeProjectVersions](https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/md-describing-model-sdk.html)를 직접 호출하세요.

------
#### [ AWS CLI ]

   다음 값을 변경합니다.
   + `project-arn`를 복사하려는 모델 버전이 포함된 신뢰할 수 있는 AWS 계정의 소스 프로젝트의 ARN으로 바꿉니다.
   + `policy-name`을 선택한 정책 이름으로 변경합니다.
   + `principal`을 `Model version ARN`에서 지정한 모델 버전에 대한 액세스를 허용하거나 거부하려는 보안 주체로 변경합니다.
   + `project-version-arn`을 복사하려는 모델 버전의 ARN으로 변경합니다.

   기존 프로젝트 정책을 업데이트하려면 `policy-revision-id` 파라미터를 지정하고 원하는 프로젝트 정책의 개정 ID를 제공하세요.

   ```
   aws rekognition put-project-policy \
     --project-arn {{project-arn}} \
     --policy-name {{policy-name}} \
     --policy-document '{ "Version": "2012-10-17",		 	 	  "Statement":[{ "Effect":"{{ALLOW or DENY}}", "Principal":{ "AWS":"{{principal}}" }, "Action":"rekognition:CopyProjectVersion", "Resource":"{{project-version-arn}}" }]}' \
     --profile custom-labels-access
   ```

------
#### [ Python ]

   다음 코드를 사용합니다. 다음 명령줄 파라미터를 제공하세요.
   + `project_arn`: 프로젝트 정책을 연결할 소스 프로젝트의 ARN 
   + `policy_name`: 사용자가 선택한 정책 이름 
   + `project_policy`: 프로젝트 정책 문서가 들어 있는 파일
   + `policy_revision_id`: (선택 사항) 기존 프로젝트 정책의 개정 버전을 업데이트하려면 프로젝트 정책의 개정 ID를 지정하세요.

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   Amazon Rekognition Custom Labels model example used in the service documentation:
   https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/md-copy-model-sdk.html
   Shows how to attach a project policy to an Amazon Rekognition Custom Labels project.
   """
   
   import boto3
   import argparse
   import logging
   import json
   from botocore.exceptions import ClientError
   
   logger = logging.getLogger(__name__)
   
   
   def put_project_policy(rek_client, project_arn, policy_name, policy_document_file, policy_revision_id=None):
       """
       Attaches a project policy to an Amazon Rekognition Custom Labels project.
       :param rek_client: The Amazon Rekognition Custom Labels Boto3 client.
       :param policy_name: A name for the project policy.
       :param project_arn: The Amazon Resource Name (ARN) of the source project
       that you want to attach the project policy to.
       :param policy_document_file: The JSON project policy document to
       attach to the source project.
       :param policy_revision_id: (Optional) The revision of an existing policy to update.
       Pass None to attach new policy.
       :return The revision ID for the project policy.
       """
   
       try:
   
           policy_document_json = ""
           response = None
   
           with open(policy_document_file, 'r') as policy_document:
               policy_document_json = json.dumps(json.load(policy_document))
   
           logger.info(
               "Attaching %s project_policy to project %s.", 
               policy_name, project_arn)
   
           if policy_revision_id is None:
               response = rek_client.put_project_policy(ProjectArn=project_arn,
                                                        PolicyName=policy_name,
                                                        PolicyDocument=policy_document_json)
   
           else:
               response = rek_client.put_project_policy(ProjectArn=project_arn,
                                                        PolicyName=policy_name,
                                                        PolicyDocument=policy_document_json,
                                                        PolicyRevisionId=policy_revision_id)
   
           new_revision_id = response['PolicyRevisionId']
   
           logger.info(
               "Finished creating project policy %s. Revision ID: %s",
               policy_name, new_revision_id)
   
           return new_revision_id
   
       except ClientError as err:
           logger.exception(
               "Couldn't attach %s project policy to project %s: %s }",
               policy_name, project_arn, err.response['Error']['Message'] )
           raise
   
   
   def add_arguments(parser):
       """
       Adds command line arguments to the parser.
       :param parser: The command line parser.
       """
   
       parser.add_argument(
           "project_arn",  help="The Amazon Resource Name (ARN) of the project "
           "that you want to attach the project policy to."
       )
       parser.add_argument(
           "policy_name",  help="A name for the project policy."
   
       )
   
       parser.add_argument(
           "project_policy",  help="The file containing the project policy JSON"
       )
   
       parser.add_argument(
           "--policy_revision_id",  help="The revision of an existing policy to update. "
           "If you don't supply a value, a new project policy is created.",
           required=False
       )
   
   
   def main():
   
       logging.basicConfig(level=logging.INFO,
                           format="%(levelname)s: %(message)s")
   
       try:
   
           # get command line arguments
           parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
           add_arguments(parser)
   
           args = parser.parse_args()
   
           print(f"Attaching policy to {args.project_arn}")
   
           session = boto3.Session(profile_name='custom-labels-access')
           rekognition_client = session.client("rekognition")
   
   
           # Attach a new policy or update an existing policy.
   
           response = put_project_policy(rekognition_client,
                                         args.project_arn,
                                         args.policy_name,
                                         args.project_policy,
                                         args.policy_revision_id)
   
           print(
               f"project policy {args.policy_name} attached to project {args.project_arn}")
           print(f"Revision ID: {response}")
   
       except ClientError as err:
           print("Problem attaching project policy: %s", err)
   
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Java V2 ]

   다음 코드를 사용합니다. 다음 명령줄 파라미터를 제공하세요.
   + `project_arn`: 프로젝트 정책을 연결할 소스 프로젝트의 ARN 
   + `project_policy_name`: 사용자가 선택한 정책 이름 
   + `project_policy_document`: 프로젝트 정책 문서가 들어 있는 파일
   + `project_policy_revision_id`: (선택 사항) 기존 프로젝트 정책의 개정 버전을 업데이트하려면 프로젝트 정책의 개정 ID를 지정하세요.

   ```
   /*
      Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
      SPDX-License-Identifier: Apache-2.0
   */
   
   package com.example.rekognition;
   
   import java.io.IOException;
   import java.nio.file.Files;
   import java.nio.file.Path;
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
   import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
   import software.amazon.awssdk.regions.Region;
   import software.amazon.awssdk.services.rekognition.RekognitionClient;
   import software.amazon.awssdk.services.rekognition.model.PutProjectPolicyRequest;
   import software.amazon.awssdk.services.rekognition.model.RekognitionException;
   
   public class PutProjectPolicy {
   
       public static final Logger logger = Logger.getLogger(PutProjectPolicy.class.getName());
   
       public static void putMyProjectPolicy(RekognitionClient rekClient, String projectArn, String projectPolicyName,
                String projectPolicyFileName, String projectPolicyRevisionId) throws IOException {
   
           try {
   
               Path filePath = Path.of(projectPolicyFileName);
   
               
   
               String policyDocument = Files.readString(filePath);
   
               String[] logArguments = new String[] { projectPolicyFileName, projectPolicyName };
   
               PutProjectPolicyRequest putProjectPolicyRequest = null;
   
               logger.log(Level.INFO, "Attaching Project policy: {0} to project: {1}", logArguments);
   
               // Attach the project policy.
   
               if (projectPolicyRevisionId == null) {
                   putProjectPolicyRequest = PutProjectPolicyRequest.builder().projectArn(projectArn)
                           .policyName(projectPolicyName).policyDocument(policyDocument).build();
               } else {
                   putProjectPolicyRequest = PutProjectPolicyRequest.builder().projectArn(projectArn)
                           .policyName(projectPolicyName).policyRevisionId(projectPolicyRevisionId)
                           .policyDocument(policyDocument)
   
                           .build();
               }
   
               rekClient.putProjectPolicy(putProjectPolicyRequest);
   
               logger.log(Level.INFO, "Attached Project policy: {0} to project: {1}", logArguments);
   
           } catch (
   
           RekognitionException e) {
               logger.log(Level.SEVERE, "Client error occurred: {0}", e.getMessage());
               throw e;
           }
   
       }
   
       public static void main(String args[]) {
   
           final String USAGE = "\n" + "Usage: "
                   + "<project_arn> <project_policy_name> <policy_document> <project_policy_revision_id>\n\n" + "Where:\n"
                   + "   project_arn - The ARN of the project that you want to attach the project policy to.\n\n"
                   + "   project_policy_name - A name for the project policy.\n\n"
                   + "   project_policy_document - The file name of the project policy.\n\n"
                   + "   project_policy_revision_id - (Optional) The revision ID of the project policy that you want to update.\n\n";
   
           if (args.length < 3 || args.length > 4) {
               System.out.println(USAGE);
               System.exit(1);
           }
   
           String projectArn = args[0];
           String projectPolicyName = args[1];
           String projectPolicyDocument = args[2];
           String projectPolicyRevisionId = null;
   
           if (args.length == 4) {
               projectPolicyRevisionId = args[3];
           }
   
           try {
   
               RekognitionClient rekClient = RekognitionClient.builder()
               .credentialsProvider(ProfileCredentialsProvider.create("custom-labels-access"))
               .region(Region.US_WEST_2)
               .build();
   
           
               // Attach the project policy.
               putMyProjectPolicy(rekClient, projectArn, projectPolicyName, projectPolicyDocument,
                       projectPolicyRevisionId);
   
               System.out.println(
                       String.format("project policy %s: attached to project: %s", projectPolicyName, projectArn));
   
               rekClient.close();
   
           } catch (RekognitionException rekError) {
               logger.log(Level.SEVERE, "Rekognition client error: {0}", rekError.getMessage());
               System.exit(1);
           }
   
           catch (IOException intError) {
               logger.log(Level.SEVERE, "Exception while reading policy document: {0}", intError.getMessage());
               System.exit(1);
           }
   
       }
   
   }
   ```

------

1. [모델 복사(SDK)](md-copy-model-sdk.md)의 지침에 따라 모델 버전을 복사하세요.