

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

# Amazon SageMaker AI Edge Manager의 첫 번째 단계
<a name="edge-manager-getting-started"></a>

이 가이드는 디바이스의 플릿을 등록, 배포, 관리하는 데 필요한 단계를 수행하는 방법과 Amazon SageMaker AI Edge Manager 필수 조건을 충족하는 방법을 보여줍니다.

**Topics**
+ [설정](edge-getting-started-step1.md)
+ [배포를 위한 모델 준비](edge-getting-started-step2.md)
+ [플릿 생성 및 등록, 디바이스 인증](edge-getting-started-step3.md)
+ [Edge Manager 다운로드 및 설정](edge-getting-started-step4.md)
+ [에이전트 실행](edge-getting-started-step5.md)

# 설정
<a name="edge-getting-started-step1"></a>

SageMaker Edge Manager를 사용하여 디바이스 플릿에서 모델을 관리하기 전에 먼저 SageMaker AI와 모두에 대한 IAM 역할을 생성해야 합니다 AWS IoT. 또한 사전 훈련된 모델, SageMakerNeo 컴파일 작업의 출력은 물론, 엣지 디바이스의 입력 데이터를 저장할 Amazon S3 버킷을 하나 이상 생성해야 합니다.

## 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

## 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

## 역할 및 스토리지 생성
<a name="edge-getting-started-step1-create-role"></a>

SageMaker Edge Manager는 Amazon S3 버킷 URI에 대한 액세스 권한을 필요로 합니다. 이를 용이하게 하려면 SageMaker AI를 실행할 수 있고 Amazon S3에 액세스할 수 있는 권한이 있는 IAM 역할을 생성합니다. 이 역할을 사용하면 SageMaker AI를 사용자 계정으로 실행하고 Amazon S3 버킷에 액세스할 수 있습니다.

IAM 콘솔, AWS SDK for Python(Boto3) 또는를 사용하여 IAM 역할을 생성할 수 있습니다 AWS CLI. 다음은 IAM 역할을 생성하고 IAM 콘솔에 필요한 정책을 연결하고 Amazon S3 버킷을 생성하는 방법의 예제입니다.

1. **Amazon SageMaker AI용 IAM 역할을 생성합니다.**

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

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

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

   1. 이 역할을 맡을 수 있게 하려는 서비스를 선택합니다. 이 경우에는 **SageMaker AI**를 선택합니다. 그런 다음 **다음: 권한**을 선택합니다.
      + 그러면 Amazon S3, Amazon ECR 및 CloudWatch Logs와 같은 관련 서비스에 대한 액세스 권한을 부여하는 IAM 정책이 자동으로 생성됩니다.

   1. **다음: 태그**를 선택합니다.

   1. (선택 사항) 태그를 키 값 페어로 연결하여 메타데이터를 역할에 추가합니다. IAM에서 태그를 사용하는 방법에 대한 자세한 내용은 [IAM 리소스 태깅](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_tags.html)을 참조하세요.

   1. **다음: 검토**를 선택합니다.

   1. **역할 이름**을 입력합니다.

   1. 가능하다면 역할 이름 또는 역할 이름 접미사를 입력합니다. 역할 이름은 AWS 계정 내에서 고유해야 합니다. 대/소문자를 구분하지 않습니다. 예를 들어, 이름이 `PRODROLE`과 `prodrole`, 두 가지로 지정된 역할을 만들 수는 없습니다. 다른 AWS 리소스가 역할을 참조할 수 있으므로 역할이 생성된 후에는 역할 이름을 편집할 수 없습니다.

   1. (선택 사항) **역할 설명**에 새 역할에 대한 설명을 입력합니다.

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

      SageMaker AI 역할 ARN을 참고하여 이 ARN을 SageMaker Neo로 컴파일 작업을 만들고 Edge Manager로 패키징 작업을 만들 때 적용합니다. 콘솔을 사용하여 역할 ARN을 찾는 방법은 다음과 같습니다.

      1. IAM 콘솔([https://console.aws.amazon.com/iam](https://console.aws.amazon.com/iam/))에 로그인합니다.

      1. **역할**을 선택합니다.

      1. 검색 필드에 역할 이름을 입력하여 방금 생성한 역할을 검색합니다.

      1. 역할을 선택합니다.

      1. 역할 ARN은 **요약** 페이지 상단에 있습니다.

1. **에 대한 IAM 역할을 생성합니다 AWS IoT.**

   생성한 AWS IoT IAM 역할은 사물 객체를 승인하는 데 사용됩니다. 또한 IAM 역할 ARN으로 SageMaker AI 클라이언트 객체를 사용하여 디바이스 플릿을 만들고 등록할 수 있습니다.

   디바이스 플릿의 디바이스를 대신하여 자격 증명 공급자가 수임하도록 AWS 계정의 IAM 역할을 구성합니다. 그런 다음 디바이스가 AWS IoT 서비스와 상호 작용할 수 있는 권한을 부여하는 정책을 연결합니다.

   SageMaker AI에 대한 역할을 생성할 때와 마찬가지로 AWS IoT 프로그래밍 방식으로 또는 IAM 콘솔을 사용하여에 대한 역할을 생성합니다.

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

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

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

   1. 이 역할을 맡을 수 있게 하려는 서비스를 선택합니다. 이 경우 **IoT**를 선택합니다. **IoT**를 **사용 사례**로 선택합니다.

   1. **다음: 권한**을 선택합니다.

   1. **다음: 태그**를 선택합니다.

   1. (선택 사항) 태그를 키 값 페어로 연결하여 메타데이터를 역할에 추가합니다. IAM에서 태그를 사용하는 방법에 대한 자세한 내용은 [IAM 리소스 태깅](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_tags.html)을 참조하세요.

   1. **다음: 검토**를 선택합니다.

   1. **역할 이름**을 입력합니다. 역할 이름은 `SageMaker AI`(으)로 시작해야 합니다.

   1. (선택 사항) **역할 설명**에 새 역할에 대한 설명을 입력합니다.

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

   1. 역할 생성 후 IAM 콘솔에서 **역할**을 선택합니다. **검색** 필드에 역할 이름을 입력하여 방금 생성한 역할을 검색합니다.

   1. 역할을 선택합니다.

   1. 다음은 **정책 연결**을 선택합니다.

   1. **검색** 필드에서 `AmazonSageMakerEdgeDeviceFleetPolicy`을(를) 검색합니다. `AmazonSageMakerEdgeDeviceFleetPolicy`를 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 신뢰 관계에 다음 정책 설명을 추가합니다.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
              "Effect": "Allow",
              "Principal": {"Service": "credentials.iot.amazonaws.com"},
              "Action": "sts:AssumeRole"
            },
            {
              "Effect": "Allow",
              "Principal": {"Service": "sagemaker.amazonaws.com"},
              "Action": "sts:AssumeRole"
            }
        ]
      }
      ```

------

      신뢰 정책은 신뢰하는 보안 주체가 역할을 맡도록 정의하는 [JSON 정책 문서](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_grammar)입니다. 신뢰 정책에 대한 자세한 내용은 [역할 용어 및 개념](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html)에서 확인하세요.

   1.  AWS IoT 역할 ARN을 기록해 둡니다. AWS IoT 역할 ARN을 사용하여 디바이스 플릿을 생성하고 등록합니다. 콘솔로 IAM 역할 ARN을 찾으려면

      1. IAM 콘솔([https://console.aws.amazon.com/iam](https://console.aws.amazon.com/iam/))로 이동합니다.

      1. **역할**을 선택합니다.

      1. **검색** 필드에 역할 이름을 입력하여 방금 생성한 역할을 검색합니다.

      1. 역할을 선택합니다.

      1. 역할 ARN은 요약 페이지에 있습니다.

1. **Amazon S3 버킷을 생성합니다.**

   SageMakerNeo와 Edge Manager는 Amazon S3 버킷에서 사전 컴파일된 모델 및 컴파일된 모델에 액세스합니다. 또한 Edge Manager는 디바이스 플릿의 샘플 데이터를 Amazon S3에 저장합니다.

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

   1. **버킷 만들기**를 선택합니다.

   1. **버킷 이름**에 버킷 이름을 입력합니다.

   1. **리전**에서 버킷이 상주할 AWS 리전을 선택합니다.

   1. **Bucket settings for Block Public Access(퍼블릭 액세스 차단을 위한 버킷 설정)**에서 버킷에 적용할 설정을 선택합니다.

   1. **버킷 생성**을 선택합니다.

   Amazon S3 버킷 생성에 대한 자세한 정보는 [Amazon S3 시작하기](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)에서 확인하세요.

# 배포를 위한 모델 준비
<a name="edge-getting-started-step2"></a>

이 섹션에서는 SageMaker AI 및 AWS IoT 클라이언트 객체를 생성하고, 사전 훈련된 기계 학습 모델을 다운로드하고, 모델을 Amazon S3 버킷에 업로드하고, SageMaker Neo를 사용하여 대상 디바이스용 모델을 컴파일하고, Edge Manager 에이전트와 함께 배포할 수 있도록 모델을 패키징합니다.

1. **라이브러리를 가져오고 클라이언트 객체를 생성합니다.**

   이 자습서에서는 AWS SDK for Python (Boto3) 를 사용하여 SageMaker AI, Amazon S3 및와 상호 작용할 클라이언트를 생성합니다 AWS IoT.

   Boto3를 가져오고, 리전을 지정하고, 다음 예제와 같이 필요한 클라이언트 객체를 초기화합니다.

   ```
   import boto3
   import json
   import time
   
   AWS_REGION = 'us-west-2'# Specify your Region
   bucket = 'bucket-name'
   
   sagemaker_client = boto3.client('sagemaker', region_name=AWS_REGION)
   iot_client = boto3.client('iot', region_name=AWS_REGION)
   ```

   변수를 정의하고 SageMaker AI 및 AWS IoT 를 문자열로 만든 역할 ARN을 할당합니다.

   ```
   # Replace with the role ARN you created for SageMaker
   sagemaker_role_arn = "arn:aws:iam::<account>:role/*"
   
   # Replace with the role ARN you created for AWS IoT. 
   # Note: The name must start with 'SageMaker'
   iot_role_arn = "arn:aws:iam::<account>:role/SageMaker*"
   ```

1. **기계 학습 모델을 훈련시킵니다.**

   SageMaker AI를 사용하여 기계 학습 모델을 훈련시키는 방법에 대한 자세한 내용은 [Train a Model with Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-training.html)를 참조하세요. 선택적으로 로컬에서 훈련된 모델을 Amazon S3 URI 버킷에 직접 업로드할 수 있습니다.

   아직 모델이 없는 경우, 이 자습서의 다음 단계에서 사전 훈련된 모델을 사용할 수 있습니다. 예를 들어, TensorFlow 프레임워크에서 MobileNet V2 모델을 저장할 수 있습니다. MobileNet V2는 모바일 애플리케이션에 최적화된 이미지 분류 모델입니다. MobileNet V2에 대한 자세한 정보는 [MobileNet GitHub README](https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet)에서 확인하세요.

   Jupyter Notebook에 다음을 입력하여 사전 훈련된 MobileNet V2 모델을 저장합니다.

   ```
   # Save the MobileNet V2 model to local storage
      import tensorflow as tf
      model = tf.keras.applications.MobileNetV2()
      model.save(“mobilenet_v2.h5”)
   ```
**참고**  
TensorFlow가 설치되어 있지 않은 경우, `pip install tensorflow=2.4`을(를) 실행하여 설치할 수 있습니다.
이 자습서에서는 TensorFlow 버전 2.4 이하를 사용합니다.

   모델이 `mobilenet_v2.h5` 파일에 저장됩니다. 모델 패키징 전 먼저 SageMakerNeo로 모델을 컴파일해야 합니다. [지원되는 프레임워크, 디바이스, 시스템, 아키텍처](neo-supported-devices-edge.md)에서 TensorFlow 버전(또는 선택한 다른 프레임워크)이 현재 SageMakerNeo에서 지원되는지 확인세요.

   SageMakerNeo를 사용하려면 모델이 압축된 TAR 파일로 저장되어야 합니다. 압축된 TAR 파일(\$1.tar.gz)로 다시 패키징합니다.

   ```
   # Package MobileNet V2 model into a TAR file 
      import tarfile
      
      tarfile_name='mobilenet-v2.tar.gz'
      
      with tarfile.open(tarfile_name, mode='w:gz') as archive:
          archive.add('mobilenet-v2.h5')
   ```

1. **Amazon S3에 모델을 업로드합니다.**

   기계 학습 모델을 확보한 후 Amazon S3 버킷에 저장합니다. 다음 예제에서는 AWS CLI 명령을 사용하여 모델이라는 디렉터리에서 이전에 생성한 Amazon S3 버킷에 *모델을* 업로드합니다. Jupyter Notebook에 다음을 입력합니다.

   ```
   !aws s3 cp mobilenet-v2.tar.gz s3://{bucket}/models/
   ```

1. **SageMakerNeo로 모델을 컴파일합니다.**

   SageMakerNeo으로 엣지 디바이스용 기계 학습 모델을 컴파일합니다. 훈련된 모델을 저장한 Amazon S3 버킷 URI, 모델 훈련 시 사용한 기계 학습 프레임워크, 모델 입력의 형태, 대상 디바이스를 알아야 합니다.

   MobileNet V2 모델의 경우 다음을 적용합니다.

   ```
   framework = 'tensorflow'
   target_device = 'jetson_nano'
   data_shape = '{"data":[1,3,224,224]}'
   ```

   SageMakerNeo에는 사용하는 딥 러닝 프레임워크를 기반으로 하는 특정 모델 입력 형태와 모델 형식이 필요합니다. 모델 저장 방법에 대한 자세한 정보는 [SageMaker Neo에 필요한 입력 데이터 형태는 무엇입니까?](neo-compilation-preparing-model.md#neo-job-compilation-expected-inputs)에서 확인하세요. Neo에서 지원되는 디바이스와 프레임워크에 대한 자세한 정보는 [지원되는 프레임워크, 디바이스, 시스템, 아키텍처](neo-supported-devices-edge.md)에서 확인하세요.

   `CreateCompilationJob` API를 사용하여 SageMakerNeo로 컴파일 작업을 생성합니다. 컴파일 작업, SageMaker AI 역할 ARN, 모델이 저장된 Amazon S3 URI, 모델의 입력 형태, 프레임워크 이름, SageMaker AI에서 컴파일된 모델을 저장할 Amazon S3 URI, 엣지 디바이스 대상의 이름을 입력합니다.

   ```
   # Specify the path where your model is stored
   model_directory = 'models'
   s3_model_uri = 's3://{}/{}/{}'.format(bucket, model_directory, tarfile_name)
   
   # Store compiled model in S3 within the 'compiled-models' directory
   compilation_output_dir = 'compiled-models'
   s3_output_location = 's3://{}/{}/'.format(bucket, compilation_output_dir)
   
   # Give your compilation job a name
   compilation_job_name = 'getting-started-demo'
   
   sagemaker_client.create_compilation_job(CompilationJobName=compilation_job_name,
                                           RoleArn=sagemaker_role_arn,
                                           InputConfig={
                                               'S3Uri': s3_model_uri,
                                               'DataInputConfig': data_shape,
                                               'Framework' : framework.upper()},
                                           OutputConfig={
                                               'S3OutputLocation': s3_output_location,
                                               'TargetDevice': target_device},
                                           StoppingCondition={'MaxRuntimeInSeconds': 900})
   ```

1. **컴파일된 모델을 패키징합니다.**

   패키징 작업은 SageMakerNeo로 컴파일된 모델을 가져와서 추론 엔진인 Edge Manager 에이전트를 사용하여 모델 배포 시 필요한 사항을 변경합니다. 모델을 패키징하려면 `create_edge_packaging` API 또는 SageMaker AI 콘솔로 엣지 패키징 작업을 만듭니다.

   Neo 컴파일 작업 시 사용한 이름, 패키징 작업 이름, 역할 ARN([설정](edge-getting-started-step1.md) 섹션 참조), 모델 이름, 모델 버전, 패키징 작업 출력을 위한 Amazon S3 버킷 URI를 입력해야 합니다. Edge Manager 패키징 작업 이름은 대소문자를 구분해야 함에 유의하세요. 다음은 API를 사용한 패키징 작업 생성 방법의 예제입니다.

   ```
   edge_packaging_name='edge-packaging-demo'
   model_name="sample-model"
   model_version="1.1"
   ```

   패키징된 모델을 저장할 Amazon S3 URI를 정의합니다.

   ```
   # Output directory where you want to store the output of the packaging job
   packaging_output_dir = 'packaged_models'
   packaging_s3_output = 's3://{}/{}'.format(bucket, packaging_output_dir)
   ```

   `CreateEdgePackagingJob`(으)로Neo로 컴파일된 모델을 패키징합니다. 엣지 패키징 작업의 이름과 컴파일 작업 시 입력한 이름을 입력합니다(이 예에서는 변수 `compilation_job_name`에 저장됨). 또한 모델 이름, 모델 버전(사용 중인 모델 버전을 추적하는 데 사용됨), SageMaker AI에서 패키지 모델을 저장할 S3 URI도 입력합니다.

   ```
   sagemaker_client.create_edge_packaging_job(
                       EdgePackagingJobName=edge_packaging_name,
                       CompilationJobName=compilation_job_name,
                       RoleArn=sagemaker_role_arn,
                       ModelName=model_name,
                       ModelVersion=model_version,
                       OutputConfig={
                           "S3OutputLocation": packaging_s3_output
                           }
                       )
   ```

# 플릿 생성 및 등록, 디바이스 인증
<a name="edge-getting-started-step3"></a>

이 섹션에서는 AWS IoT 사물 객체를 생성하고, 디바이스 플릿을 생성하고, 디바이스 플릿을 등록하여 클라우드와 상호 작용하고, 디바이스를 인증할 X.509 인증서를 생성하고 AWS IoT Core, 플릿을 생성할 때 AWS IoT 생성된와 역할 별칭을 연결하고, 자격 증명 공급자의 AWS 계정별 엔드포인트를 가져오고, 공식 Amazon Root CA 파일을 가져오고, Amazon CA 파일을 Amazon S3에 업로드합니다.

1. ** AWS IoT 사물을 생성합니다.**

   SageMaker Edge Manager는 AWS IoT Core 서비스를 활용하여 AWS 클라우드의 엣지 디바이스와 엔드포인트 간의 연결을 용이하게 합니다. Edge Manager와 함께 작동하도록 디바이스를 설정한 후 기존 AWS IoT 기능을 활용할 수 있습니다.

   디바이스를 연결하려면 AWS IoT *객체를* 생성하고, AWS IoT에 클라이언트 인증서를 생성 및 등록하고, 디바이스에 대한 IAM 역할을 생성 및 구성 AWS IoT해야 합니다.

   먼저 Boto3를 사용하여 이전에 생성한 AWS IoT 클라이언트(`iot_client`)를 사용하여 AWS IoT 사물 객체를 생성합니다. 다음 예제에서 두 가지 사물 객체를 생성하는 방법을 알아봅시다.

   ```
   iot_thing_name = 'sample-device'
   iot_thing_type = 'getting-started-demo'
   
   iot_client.create_thing_type(
       thingTypeName=iot_thing_type
   )
   
   # Create an AWS IoT thing objects
   iot_client.create_thing(
       thingName=iot_thing_name,
       thingTypeName=iot_thing_type
   )
   ```

1. **디바이스 플릿을 생성합니다.**

   이전 단계에서 정의한 SageMaker AI 클라이언트 객체로 디바이스 플릿을 만듭니다. 또한 SageMaker AI 콘솔로 디바이스 플릿을 만들 수 있습니다.

   ```
   import time
   device_fleet_name="demo-device-fleet" + str(time.time()).split('.')[0]
   device_name="sagemaker-edge-demo-device" + str(time.time()).split('.')[0]
   ```

   IoT 역할 ARN을 지정합니다. 이렇게 하면 디바이스에 임시 자격 증명을 AWS IoT 부여할 수 있습니다.

   ```
   device_model_directory='device_output'
   s3_device_fleet_output = 's3://{}/{}'.format(bucket, device_model_directory)
   
   sagemaker_client.create_device_fleet(
       DeviceFleetName=device_fleet_name,
       RoleArn=iot_role_arn, # IoT Role ARN specified in previous step
       OutputConfig={
           'S3OutputLocation': s3_device_fleet_output
       }
   )
   ```

   디바이스 플릿을 생성할 때 AWS IoT 역할 별칭이 생성됩니다. 이 역할 별칭은 이후 단계에서 `iot_client` 객체를 AWS IoT 사용하는 것과 연결됩니다.

1. **디바이스 플릿을 등록합니다.**

   클라우드와 상호 작용하려면 SageMaker Edge Manager에 디바이스를 등록해야 합니다. 이 예제에서는 생성한 플릿에 단일 디바이스를 등록합니다. 디바이스를 등록하려면 다음 예제와 같이 디바이스 이름과 AWS IoT 사물 이름을 입력해야 합니다.

   ```
   # Device name should be 36 characters
   device_name = "sagemaker-edge-demo-device" + str(time.time()).split('.')[0]
   
   sagemaker_client.register_devices(
       DeviceFleetName=device_fleet_name,
       Devices=[
           {
               "DeviceName": device_name,
               "IotThingName": iot_thing_name
           }
       ]
   )
   ```

1. **X.509 인증서를 생성합니다.**

    AWS IoT 사물 객체를 생성한 후 사물 객체에 대한 X.509 디바이스 인증서를 생성해야 합니다. 이 인증서는 디바이스를 AWS IoT Core에서 인증합니다.

   다음을 사용하여 이전에 정의된 AWS IoT 클라이언트(`iot_client`)를 사용하여 프라이빗 키, 퍼블릭 키 및 X.509 인증서 파일을 생성합니다.

   ```
   # Creates a 2048-bit RSA key pair and issues an X.509 # certificate 
   # using the issued public key.
   create_cert = iot_client.create_keys_and_certificate(
       setAsActive=True 
   )
   
   # Get certificate from dictionary object and save in its own
   with open('./device.pem.crt', 'w') as f:
       for line in create_cert['certificatePem'].split('\n'):
           f.write(line)
           f.write('\n')
   # Get private key from dictionary object and save in its own 
   with open('./private.pem.key', 'w') as f:
       for line in create_cert['keyPair']['PrivateKey'].split('\n'):
           f.write(line)
           f.write('\n')
   # Get a private key from dictionary object and save in its own 
   with open('./public.pem.key', 'w') as f:
       for line in create_cert['keyPair']['PublicKey'].split('\n'):
           f.write(line)
           f.write('\n')
   ```

1. **역할 별칭을와 연결합니다 AWS IoT.**

   SageMaker AI(`sagemaker_client.create_device_fleet()`)로 디바이스 플릿을 만들면 역할 별칭이 자동으로 생성됩니다. AWS IoT 역할 별칭은 연결된 디바이스가 X.509 인증서를 AWS IoT 사용하여에 인증한 다음 역할 별칭과 연결된 IAM 역할에서 수명이 짧은 AWS 자격 증명을 얻는 AWS IoT 메커니즘을 제공합니다. 역할 별칭을 사용하면 디바이스를 업데이트하지 않고도 역할을 변경할 수 있습니다. `DescribeDeviceFleet`(으)로 역할 별칭 이름 및 ARN을 가져옵니다.

   ```
   # Print Amazon Resource Name (ARN) and alias that has access 
   # to AWS Internet of Things (IoT).
   sagemaker_client.describe_device_fleet(DeviceFleetName=device_fleet_name)
   
   # Store iot role alias string in a variable
   # Grabs role ARN
   full_role_alias_name = sagemaker_client.describe_device_fleet(DeviceFleetName=device_fleet_name)['IotRoleAlias']
   start_index = full_role_alias_name.find('SageMaker') # Find beginning of role name  
   role_alias_name = full_role_alias_name[start_index:]
   ```

   `iot_client`를 사용하여 디바이스 플릿 생성에서 생성된 역할 별칭을 AWS IoT다음과 쉽게 연결할 수 있습니다.

   ```
   role_alias = iot_client.describe_role_alias(
                       roleAlias=role_alias_name)
   ```

   IAM 역할 별칭에 대한 자세한 정보는 [미 사용 서비스 액세스를 허용하는 역할 별칭](https://docs.aws.amazon.com/iot/latest/developerguide/audit-chk-role-alias-unused-svcs.html)에서 확인하세요.

   디바이스의 성공적인 인증을 위해 AWS IoT 이전에에 인증서를 생성하고 등록했습니다. 이제 정책을 생성하고 인증서에 연결하여 보안 토큰 요청을 승인해야 합니다.

   ```
   alias_policy = {
     "Version": "2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Allow",
       "Action": "iot:AssumeRoleWithCertificate",
       "Resource": role_alias['roleAliasDescription']['roleAliasArn']
     }
   }
   
   policy_name = 'aliaspolicy-'+ str(time.time()).split('.')[0]
   aliaspolicy = iot_client.create_policy(policyName=policy_name,
                                          policyDocument=json.dumps(alias_policy))
   
   # Attach policy
   iot_client.attach_policy(policyName=policy_name,
                               target=create_cert['certificateArn'])
   ```

1. **자격 증명 공급자의 AWS 계정별 엔드포인트를 가져옵니다.**

   엣지 디바이스에서 자격 증명을 수락하려면 엔드포인트가 필요합니다. 자격 증명 공급자를 위한 AWS 계정별 엔드포인트를 획득합니다.

   ```
   # Get the unique endpoint specific to your AWS account that is making the call.
   iot_endpoint = iot_client.describe_endpoint(
       endpointType='iot:CredentialProvider'
   )
   
   endpoint="https://{}/role-aliases/{}/credentials".format(iot_endpoint['endpointAddress'],role_alias_name)
   ```

1. **공식 Amazon 루트 CA 파일을 가져와 Amazon S3 버킷에 업로드합니다.**

   Jupyter Notebook 또는에서 다음을 사용합니다 AWS CLI (터미널을 사용하는 경우 '\$1' 매직 함수 제거).

   ```
   !wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

   이 엔드포인트를 사용하여 HTTPS 요청을 통해 자격 증명 공급자에게 보안 토큰을 반환하라고 요청합니다. 다음 예제 명령은 `curl`을 사용하지만 모든 HTTP 클라이언트를 사용할 수 있습니다.

   ```
   !curl --cert device.pem.crt --key private.pem.key --cacert AmazonRootCA1.pem $endpoint
   ```

   인증서가 확인되면 Amazon S3 버킷 URI에 키와 인증서를 업로드합니다.

   ```
   !aws s3 cp private.pem.key s3://{bucket}/authorization-files/
   !aws s3 cp device.pem.crt s3://{bucket}/authorization-files/
   !aws s3 cp AmazonRootCA1.pem s3://{bucket}/authorization-files/
   ```

   키와 인증서를 다른 디렉터리로 이동하여 작업 디렉터리를 정리합니다.

   ```
   # Optional - Clean up working directory
   !mkdir authorization-files
   !mv private.pem.key device.pem.crt AmazonRootCA1.pem authorization-files/
   ```

# Edge Manager 다운로드 및 설정
<a name="edge-getting-started-step4"></a>

Edge Manager 에이전트는 엣지 디바이스용 추론 엔진입니다. 에이전트를 사용하면 엣지 디바이스에 로드된 모델로 예측을 수행할 수 있습니다. 또한 에이전트는 모델 지표를 수집하고 특정 간격으로 데이터를 캡처합니다.



이 섹션에서는 에이전트로 디바이스를 설정해 보겠습니다. 그러려면 우선 릴리스 버킷의 릴리스 아티팩트와 서명 루트 인증서를 머신에 로컬로 복사해야 합니다. 릴리스 아티팩트를 압축 해제한 후 Amazon S3에 업로드합니다. 다음으로 에이전트의 구성 파일을 정의하고 저장합니다. 복사 및 붙여넣기할 템플릿이 제공됩니다. 마지막으로 릴리스 아티팩트, 구성 파일, 자격 증명을 디바이스에 복사합니다.

1. **SageMaker Edge Manager 에이전트를 다운로드합니다.**

   지원되는 운영 체제에 따라 에이전트는 바이너리 형식으로 릴리스됩니다. 이 예제는 Linux 운영 체제를 사용하고 ARM64 아키텍처를 사용하는 Jetson Nano에서 추론을 실행합니다. 디바이스 지원 운영 체제 및 아키텍처에 대한 자세한 정보는 [지원되는 디바이스, 칩 아키텍처, 시스템](neo-supported-devices-edge-devices.md)에서 확인하세요.

   us-west-2 리전의 SageMaker Edge Manager 릴리스 버킷에서 최신 버전 바이너리를 가져옵니다.

   ```
   !aws s3 ls s3://sagemaker-edge-release-store-us-west-2-linux-armv8/Releases/ | sort -r
   ```

   그러면 버전 기준으로 정렬된 릴리스 아티팩트가 반환됩니다.

   ```
                              PRE 1.20210512.96da6cc/
                              PRE 1.20210305.a4bc999/
                              PRE 1.20201218.81f481f/
                              PRE 1.20201207.02d0e97/
   ```

   버전 형식은 `<MAJOR_VERSION>.<YYYY-MM-DD>.<SHA-7>`입니다. 세 가지 구성 요소로 구성되어 있습니다.
   + `<MAJOR_VERSION>`: 릴리스 버전. 릴리스 버전은 현재 `1`(으)로 설정되어 있습니다.
   + `<YYYY-MM-DD>`: 아티팩트 릴리스의 타임스탬프.
   + <SHA-7>: 릴리스가 빌드된 리포지토리 커밋 ID.

   압축된 TAR 파일을 로컬로 복사하거나 디바이스에 직접 복사. 다음 예제에서 이 문서가 릴리스된 시점의 최신 릴리스 아티팩트를 복사하는 방법을 알아봅시다.

   ```
   !aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Releases/1.20201218.81f481f/1.20201218.81f481f.tgz ./
   ```

   아티팩트가 있으면 압축된 TAR 파일의 압축을 풉니다. 다음은 TAR 파일의 압축을 풀고 `agent_demo` 디렉토리에 저장합니다.

   ```
   !mkdir agent_demo
   !tar -xvzf 1.20201218.81f481f.tgz -C ./agent_demo
   ```

   Amazon S3 버킷에 에이전트 릴리스 아티팩트를 업로드합니다. 다음 코드 예제에서는 `agent_demo`에 있는 콘텐츠를 복사하여 `agent_demo` Amazon S3 버킷에 있는 디렉터리에 업로드합니다.

   ```
   !aws s3 cp --recursive ./agent_demo s3://{bucket}/agent_demo
   ```

   또한 릴리스 버킷의 서명 루트 인증서도 필요합니다.

   ```
   !aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Certificates/us-west-2/us-west-2.pem ./
   ```

   Amazon S3 버킷에 서명 루트 인증서를 업로드합니다.

   ```
   !aws s3 cp us-west-2.pem s3://{bucket}/authorization-files/
   ```

1. **SageMaker Edge Manager 에이전트 구성 파일을 정의합니다.**

   먼저 에이전트 구성 파일을 다음과 같이 정의합니다.

   ```
   sagemaker_edge_config = {
       "sagemaker_edge_core_device_name": "device_name",
       "sagemaker_edge_core_device_fleet_name": "device_fleet_name",
       "sagemaker_edge_core_capture_data_buffer_size": 30,
       "sagemaker_edge_core_capture_data_push_period_seconds": 4,
       "sagemaker_edge_core_folder_prefix": "demo_capture",
       "sagemaker_edge_core_region": "us-west-2",
       "sagemaker_edge_core_root_certs_path": "/agent_demo/certificates",
       "sagemaker_edge_provider_aws_ca_cert_file": "/agent_demo/iot-credentials/AmazonRootCA1.pem",
       "sagemaker_edge_provider_aws_cert_file": "/agent_demo/iot-credentials/device.pem.crt",
       "sagemaker_edge_provider_aws_cert_pk_file": "/agent_demo/iot-credentials/private.pem.key",
       "sagemaker_edge_provider_aws_iot_cred_endpoint": "endpoint",
       "sagemaker_edge_provider_provider": "Aws",
       "sagemaker_edge_provider_s3_bucket_name": bucket,
       "sagemaker_edge_core_capture_data_destination": "Cloud"
   }
   ```

   다음을 바꿉니다.
   + `"device_name"`을(를) 디바이스 이름으로(이 문자열은 이전 단계에서 `device_name` 변수에 저장).
   + `"device_fleet_name`을(를) 디바이스 플릿 이름으로(이 문자열은 이전 단계에서 `device_fleet_name` 변수에 저장).
   + `"endpoint"` 자격 증명 공급자에 대한 AWS 계정별 엔드포인트를 사용합니다(이 문자열은 라는 변수의 이전 단계에서 저장됨`endpoint`).

   그런 다음 JSON 파일로 저장합니다.

   ```
   edge_config_file = open("sagemaker_edge_config.json", "w")
   json.dump(sagemaker_edge_config, edge_config_file, indent = 6)
   edge_config_file.close()
   ```

   Amazon S3 버킷에 구성 파일을 업로드합니다.

   ```
   !aws s3 cp sagemaker_edge_config.json s3://{bucket}/
   ```

1. **릴리스 아티팩트, 구성 파일, 자격 증명을 디바이스에 복사합니다.**

   다음 지침은 엣지 디바이스에 적용됩니다.
**참고**  
먼저 엣지 디바이스 AWS CLI 에 Python AWS SDK for Python (Boto3), 및를 설치해야 합니다.

   디바이스에서 터미널을 엽니다. 릴리스 아티팩트, 자격 증명, 구성 파일을 저장할 폴더를 생성합니다.

   ```
   mkdir agent_demo
   cd agent_demo
   ```

   Amazon S3 버킷에 저장한 릴리스 아티팩트 콘텐츠를 디바이스에 복사합니다.

   ```
   # Copy release artifacts 
   aws s3 cp s3://<bucket-name>/agent_demo/ ./ --recursive
   ```

   (릴리스 아티팩트 콘텐츠는 이전 단계에서 `agent_demo` 디렉터리에 저장.) `<bucket-name>`, `agent_demo`을(를) 각각 Amazon S3 버킷 이름과 릴리스 아티팩트 파일 경로로 바꿉니다.

   `/bin` 디렉터리로 이동하여 바이너리 파일을 실행 가능하게 만듭니다.

   ```
   cd bin
   
   chmod +x sagemaker_edge_agent_binary
   chmod +x sagemaker_edge_agent_client_example
   
   cd agent_demo
   ```

   자격 AWS IoT 증명을 저장할 디렉터리를 만들고 Amazon S3 버킷에서 엣지 디바이스로 자격 증명을 복사합니다( 변수에 정의한 것과 동일한을 사용합니다`bucket`.

   ```
   mkdir iot-credentials
   cd iot-credentials
   
   aws s3 cp s3://<bucket-name>/authorization-files/AmazonRootCA1.pem ./
   aws s3 cp s3://<bucket-name>/authorization-files/device.pem.crt ./
   aws s3 cp s3://<bucket-name>/authorization-files/private.pem.key ./
   
   cd ../
   ```

   모델 서명 루트 인증서를 저장할 디렉터리를 만듭니다.

   ```
   mkdir certificates
   
   cd certificates
   
   aws s3 cp s3://<bucket-name>/authorization-files/us-west-2.pem ./
   
   cd agent_demo
   ```

   구성 파일을 디바이스에 복사합니다.

   ```
   #Download config file from S3
   aws s3 cp s3://<bucket-name>/sagemaker_edge_config.json ./
   
   cd agent_demo
   ```

   엣지 디바이스의 `agent_demo` 디렉터리는 다음과 비슷한 형태가 됩니다.

   ```
   ├──agent_demo
   |    ├── bin
   |        ├── sagemaker_edge_agent_binary
   |        └── sagemaker_edge_agent_client_example
   |    ├── sagemaker_edge_config.json
   |    ├── certificates
   |        └──us-west-2.pem
   |    ├── iot-credentials
   |        ├── AmazonRootCA1.pem
   |        ├── device.pem.crt
   |        └── private.pem.key
   |    ├── docs
   |        ├── api
   |        └── examples
   |    ├── ATTRIBUTIONS.txt
   |    ├── LICENSE.txt  
   |    └── RELEASE_NOTES.md
   ```

# 에이전트 실행
<a name="edge-getting-started-step5"></a>

이 섹션에서는 gRPC를 사용하여 에이전트를 바이너리로 실행하고 디바이스와 플릿이 모두 작동하고 샘플 데이터를 수집하고 있는지 확인합니다.

1. **에이전트를 시작합니다.**

   SageMaker Edge Manager 에이전트는 실행 가능 및 연결 가능 형식(ELF) 실행 가능 바이너리 형태의 독립 실행형 프로세스로 실행하거나 동적 공유 객체(.dll)로 연결할 수 있습니다. 독립 실행형 바이너리로 실행하는 것이 기본 설정 모드이며 Linux에서 지원됩니다.

   이 예제에서는 gRPC를 사용하여 에이전트를 실행합니다. gRPC는 모든 환경에서 실행할 수 있는 오픈 소스 고성능 원격 프로시저 호출(RPC) 프레임워크입니다. gRPC에 대한 자세한 정보는 [gRPC 설명서](https://grpc.io/docs/)에서 확인하세요.

   gRPC를 사용하는 방법은 다음과 같습니다.

   1. .proto 파일에 서비스를 정의합니다.

   1. 프로토콜 버퍼 컴파일러를 사용하여 서버 및 클라이언트 코드를 생성합니다.

   1. Python(또는 gRPC에서 지원하는 다른 언어) gRPC API를 사용하여 서비스용 서버를 작성합니다.

   1. Python(또는 gRPC에서 지원하는 다른 언어) gRPC API를 사용하여 클라이언트용 서버를 작성합니다.

   다운로드한 릴리스 아티팩트에는 에이전트를 실행할 수 있는 gRPC 애플리케이션이 포함되어 있습니다. 예제는 릴리스 아티팩트의 `/bin` 디렉터리 내에 있습니다. `sagemaker_edge_agent_binary` 바이너리 실행 파일은 이 디렉터리에 있습니다.

   이 예제로 에이전트를 실행하려면 소켓 파일(.sock) 및 JSON .config 파일의 경로를 입력합니다.

   ```
   ./bin/sagemaker_edge_agent_binary -a /tmp/sagemaker_edge_agent_example.sock -c sagemaker_edge_config.json
   ```

1. **디바이스를 확인합니다.**

   디바이스가 연결되어 있고 데이터 샘플링 중인지 확인합니다. 수동 또는 자동 정기 점검을 통해 디바이스나 플릿의 정상 작동 여부를 확인할 수 있습니다.

   디바이스 소속 플릿의 이름과 고유 디바이스 식별자를 입력합니다. 로컬 시스템에서 다음을 실행합니다.

   ```
   sagemaker_client.describe_device(
       DeviceName=device_name,
       DeviceFleetName=device_fleet_name
   )
   ```

   주어진 모델의 이름, 모델 버전, 최신 샘플 시간, 마지막 추론 시점을 확인할 수 있습니다.

   ```
   { 
     "DeviceName": "sample-device",
     "DeviceFleetName": "demo-device-fleet",
     "IoTThingName": "sample-thing-name-1",
     "RegistrationTime": 1600977370,
     "LatestHeartbeat": 1600977370,
     "Models":[
       {
           "ModelName": "mobilenet_v2.tar.gz", 
           "ModelVersion": "1.1",
           "LatestSampleTime": 1600977370,
           "LatestInference": 1600977370 
       }
     ]
   }
   ```

   `LastetHeartbeat`에서 제공하는 타임스탬프는 디바이스로부터 수신된 마지막 신호를 나타냅니다. `LatestSampleTime`, `LatestInference`은(는) 각각 마지막 데이터 샘플과 추론의 타임스탬프를 나타냅니다.

1. **플릿을 확인합니다.**

   플릿 `GetDeviceFleetReport`에서 작동하는지 확인합니다. 디바이스가 속한 플릿 이름을 입력합니다.

   ```
   sagemaker_client.get_device_fleet_report(
       DeviceFleetName=device_fleet_name
   )
   ```

   데이터 샘플이 저장된 Amazon S3 버킷 URI와 더불어, 주어진 모델의 이름, 모델 버전, 최신 샘플 시간, 마지막 추론 시점을 확인할 수 있습니다.

   ```
   # Sample output
   {
    "DeviceFleetName": "sample-device-fleet",
    "DeviceFleetArn": "arn:aws:sagemaker:us-west-2:9999999999:device-fleet/sample-fleet-name",
    "OutputConfig": {
                 "S3OutputLocation": "s3://fleet-bucket/package_output",
     },
    "AgentVersions":[{"Version": "1.1", "AgentCount": 2}]}
    "DeviceStats": {"Connected": 2, "Registered": 2}, 
    "Models":[{
               "ModelName": "sample-model", 
               "ModelVersion": "1.1",
               "OfflineDeviceCount": 0,
               "ConnectedDeviceCount": 2,
               "ActiveDeviceCount": 2, 
               "SamplingDeviceCount": 100
               }]
   }
   ```