

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

# 자습서:에 대한 사용자 지정 권한 부여자 생성 AWS IoT Core
<a name="custom-auth-tutorial"></a>

이 자습서에서는 AWS CLI을(를) 사용하여 사용자 지정 인증을 만들고 유효성을 검사하고 사용하는 단계를 보여 줍니다. 선택적으로 이 자습서를 사용하여 HTTP 게시 API를 통해 AWS IoT Core 에 데이터를 전송할 수 있도록 Postman을 사용할 수 있습니다.

이 자습서에서는 권한 부여 및 인증 논리를 구현하는 샘플 Lambda 함수와 토큰 서명이 활성화된 상태에서 **create-authorizer** 호출을 사용하는 사용자 지정 권한 부여자를 생성하는 방법을 보여줍니다. 그런 다음 권한 부여자는를 사용하여 검증되며**test-invoke-authorizer**, 마지막으로 HTTP 게시 API를 AWS IoT Core 사용하여 테스트 MQTT 주제에 데이터를 전송할 수 있습니다. 샘플 요청은 `x-amz-customauthorizer-name` 헤더를 사용하여 호출할 권한 부여자를 지정하고, 요청 헤더에 토큰 키 이름과 `x-amz-customauthorizer-signature`을(를) 전달합니다.

**이 자습서에서 배울 내용:**
+ Lambda 함수를 사용자 지정 권한 부여 처리기로 만드는 방법
+ 토큰 서명이 활성화된 AWS CLI 를 사용하여 사용자 지정 권한 부여자를 생성하는 방법
+ **test-invoke-authorizer** 명령을 사용하여 사용자 지정 권한 부여자를 테스트 하는 방법
+ [Postman](https://www.postman.com/)을 사용하여 MQTT 항목을 게시하는 방법 및 사용자 정의 권한 부여자로 요청을 검증하는 방법

이 자습서는 완료하는 데 약 60분이 소요됩니다.

**Topics**
+ [1단계: 사용자 지정 권한 부여자를 위한 Lambda 함수 생성](#custom-auth-tutorial-define)
+ [2단계: 사용자 지정 권한 부여자를 위한 퍼블릭 및 프라이빗 키 페어 생성](#custom-auth-tutorial-keys)
+ [3단계: 사용자 지정 권한 부여자 리소스 및 권한 부여 생성](#custom-auth-tutorial-authorizer)
+ [4단계: test-invoke-authorizer를 호출하여 권한 부여자 테스트](#custom-auth-tutorial-test)
+ [5단계: Postman을 사용하여 MQTT 메시지 게시 테스트](#custom-auth-tutorial-postman)
+ [6단계: MQTT 테스트 클라이언트에서 메시지 보기](#custom-auth-tutorial-testclient)
+ [7단계: 결과 및 다음 단계 검토](#custom-auth-tutorial-review)
+ [8단계: 정리](#custom-auth-tutorial-cleanup)

**이 자습서를 시작하기 전에 다음 사항을 확인해야 합니다.**
+ 

**[설정 AWS 계정](setting-up.md)**  
이 자습서를 완료하려면 AWS 계정 및 AWS IoT 콘솔이 필요합니다.

  이 자습서에 사용하는 계정은 적어도 이러한 AWS 관리형 정책을 포함 할 때 가장 잘 작동합니다.
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor)
**중요**  
이 자습서에서 사용된 IAM 정책은 프로덕션 구현에서 따라야 하는 것보다 권한이 많습니다. 프로덕션 환경에서는 계정 및 리소스 정책이 필요한 권한만 부여하도록 해야 합니다.  
프로덕션용 IAM 정책을 생성할 때는 사용자 및 역할이 필요로 하는 액세스 수준을 결정한 다음 사용자들이 이러한 작업만 수행할 수 있도록 허용하는 정책을 설계합니다.  
자세한 내용은 [IAM의 보안 모범 사례](https://docs.aws.amazon.com//IAM/latest/UserGuide/best-practices.html)를 참조하세요.
+ 

**를 설치했습니다. AWS CLI**  
설치 방법에 대한 자세한 내용은 CLI 설치를 AWS CLI참조하세요. [AWS](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-install.html) 이 자습서에는 AWS CLI 버전 `aws-cli/2.1.3 Python/3.7.4 Darwin/18.7.0 exe/x86_64` 이상이 필요합니다.
+ 

**OpenSSL 도구**  
이 자습서의 예제에서는 [LibreSSL 2.6.5](https://www.libressl.org/)를 사용합니다. 이 자습서를 위해서는 [OpenSSL v1.1.1i](https://www.openssl.org/) 도구도 사용할 수 있습니다.
+ 

**[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) 개요 검토**  
 AWS Lambda 이전에를 사용한 적이 없는 경우 [AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) 및 [Lambda 시작하기를](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html) 검토하여 해당 용어와 개념을 알아봅니다.
+ 

**Postman에서 요청을 빌드하는 방법 검토**  
자세한 내용은 [요청 빌드](https://learning.postman.com/docs/sending-requests/requests/) 단원을 참조하세요.
+ 

**이전 자습서의 사용자 지정 권한 부여자 제거**  
에는 한 번에 제한된 수의 사용자 지정 권한 부여자만 구성할 AWS 계정 수 있습니다. 사용자 지정 권한 부여자를 제거하는 방법에 대한 자세한 내용은 [8단계: 정리](#custom-auth-tutorial-cleanup) 단원을 참조하세요.

## 1단계: 사용자 지정 권한 부여자를 위한 Lambda 함수 생성
<a name="custom-auth-tutorial-define"></a>

의 사용자 지정 인증 AWS IoT Core 은 사용자가 생성한 [권한 부여자 리소스를](https://docs.aws.amazon.com//iot/latest/apireference/API_AuthorizerDescription.html) 사용하여 클라이언트를 인증하고 권한을 부여합니다. 이 섹션에서 생성할 함수는 클라이언트가 AWS IoT 리소스에 연결하고 액세스할 때 클라이언트를 인증 AWS IoT Core 하고 승인합니다.

Lambda 함수는 다음 작업을 수행합니다.
+ **test-invoke-authorizer**에서 요청이 오는 경우 `Deny` 작업과 함께 IAM 정책을 반환합니다.
+ 요청이 HTTP를 사용하여 Postma에서 오고 `actionToken` 파라미터 값이 `allow`이면 `Allow` 작업과 함께 IAM 정책을 반환합니다. 그렇지 않은 경우`Deny` 작업과 함께 IAM 정책을 반환합니다.

**사용자 지정 권한 부여자에 대한 Lambda 함수를 생성하려면**

1. [Lambda](https://console.aws.amazon.com//lambda/home#) 콘솔에서 [함수](https://console.aws.amazon.com//lambda/home#/functions)를 엽니다.

1. **함수 생성**을 선택합니다.

1. **처음부터 작성(Author from scratch)**이 선택되어 있는지 확인합니다.

1. **기본 정보**에서

   1. **함수 이름**에 **custom-auth-function**을(를) 입력합니다.

   1. **런타임**에서 **Node.js 18.x**를 확인합니다.

1. **함수 생성**을 선택합니다.

   Lambda는 Node.js 함수와 로그 업로드 권한을 함수에 부여하는 [실행 역할](https://docs.aws.amazon.com//lambda/latest/dg/lambda-intro-execution-role.html)을 생성합니다. Lambda 함수는 함수를 호출할 때 실행 역할을 수임하고 실행 역할을 사용하여 AWS SDK에 대한 자격 증명을 생성하고 이벤트 소스에서 데이터를 읽습니다.

1. [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) 편집기에서 함수의 코드 및 구성을 보려면 디자이너 창에서 **custom-auth-function**을 선택한 후 편집기 탐색 창에서 **index.js**를 선택합니다.

   Node.js 같은 스크립트 언어의 경우 Lambda는 성공 응답을 반환하는 기본 함수를 포함합니다. 소스 코드가 3MB를 초과하지 않는 한 [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) 편집기를 사용하여 함수를 편집할 수 있습니다.

1. 다음 코드를 사용하여 편집기에서 **index.js** 코드를 대체합니다.

   ```
   // A simple Lambda function for an authorizer. It demonstrates
   // How to parse a CLI and Http password to generate a response.
   
   export const handler = async (event, context, callback) => {
   
       //Http parameter to initiate allow/deny request
       const HTTP_PARAM_NAME='actionToken';
       const ALLOW_ACTION = 'Allow';
       const DENY_ACTION = 'Deny';
   
       //Event data passed to Lambda function
       var event_str = JSON.stringify(event);
       console.log('Complete event :'+ event_str);
   
       //Read protocolData from the event json passed to Lambda function
       var protocolData = event.protocolData;
       console.log('protocolData value---> ' + protocolData);
   
       //Get the dynamic account ID from function's ARN to be used
       // as full resource for IAM policy
       var ACCOUNT_ID = context.invokedFunctionArn.split(":")[4];
       console.log("ACCOUNT_ID---"+ACCOUNT_ID);
   
       //Get the dynamic region from function's ARN to be used
       // as full resource for IAM policy
       var REGION = context.invokedFunctionArn.split(":")[3];
       console.log("REGION---"+REGION);
   
       //protocolData data will be undefined if testing is done via CLI.
       // This will help to test the set up.
       if (protocolData === undefined) {
   
           //If CLI testing, pass deny action as this is for testing purpose only.
           console.log('Using the test-invoke-authorizer cli for testing only');
           callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
       } else{
   
           //Http Testing from Postman
           //Get the query string from the request
           var queryString = event.protocolData.http.queryString;
           console.log('queryString values -- ' + queryString);
           /*         global URLSearchParams       */
           const params = new URLSearchParams(queryString);
           var action = params.get(HTTP_PARAM_NAME);
   
           if(action!=null && action.toLowerCase() === 'allow'){
   
               callback(null, generateAuthResponse(ALLOW_ACTION,ACCOUNT_ID,REGION));
   
           }else{
   
               callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
           }
   
       }
   
   };
   
   // Helper function to generate the authorization IAM response.
   var generateAuthResponse = function(effect,ACCOUNT_ID,REGION) {
   
       var full_resource = "arn:aws:iot:"+ REGION + ":" + ACCOUNT_ID + ":*";
       console.log("full_resource---"+full_resource);
   
       var authResponse = {};
       authResponse.isAuthenticated = true;
       authResponse.principalId = 'principalId';
   
       var policyDocument = {};
       policyDocument.Version = '2012-10-17';		 	 	 
       policyDocument.Statement = [];
       var statement = {};
       statement.Action = 'iot:*';
       statement.Effect = effect;
       statement.Resource = full_resource;
       policyDocument.Statement[0] = statement;
       authResponse.policyDocuments = [policyDocument];
       authResponse.disconnectAfterInSeconds = 3600;
       authResponse.refreshAfterInSeconds = 600;
   
       console.log('custom auth policy function called from http');
       console.log('authResponse --> ' + JSON.stringify(authResponse));
       console.log(authResponse.policyDocuments[0]);
   
       return authResponse;
   }
   ```

1. **배포**를 선택합니다.

1. 편집기 위에 **변경 사항 배포됨(Changes deployed)**이 나타나면

   1. 편집기 위의 **함수 개요(Function overview)** 섹션으로 스크롤합니다.

   1. 이 자습서의 후반부에서 사용할 수 있도록 **함수 ARN**을 복사하여 저장해 둡니다.

1.  함수를 테스트합니다.

   1. **테스트** 탭을 선택합니다.

   1. 기본 테스트 설정을 사용하여 **호출(Invoke)**을 선택합니다.

   1. 테스트가 성공한 경우 **실행 결과(Execution results)**에서 **세부 정보(Details)** 보기를 엽니다. 함수가 반환한 정책 문서가 표시되어야 합니다.

      테스트에 실패했거나 정책 문서가 표시되지 않으면 코드를 검토하여 오류를 찾아 수정합니다.

## 2단계: 사용자 지정 권한 부여자를 위한 퍼블릭 및 프라이빗 키 페어 생성
<a name="custom-auth-tutorial-keys"></a>

사용자 지정 권한 부여자를 인증하려면 퍼블릭 및 프라이빗 키가 필요합니다. 이 섹션의 명령은 OpenSSL 도구를 사용하여 이 키 페어를 생성합니다.

**사용자 지정 권한 부여자를 위한 퍼블릭 및 프라이빗 키 페어를 생성하려면**

1. 프라이빗 키 파일을 생성합니다.

   ```
   openssl genrsa -out private-key.pem 4096
   ```

1. 방금 생성한 프라이빗 키 파일을 확인합니다.

   ```
   openssl rsa -check -in private-key.pem -noout
   ```

   명령에 오류가 표시되지 않으면 프라이빗 키 파일이 유효합니다.

1. 퍼블릭 키 파일을 생성합니다.

   ```
   openssl rsa -in private-key.pem -pubout -out public-key.pem
   ```

1. 퍼블릭 키 파일을 확인합니다.

   ```
   openssl pkey -inform PEM -pubin -in public-key.pem -noout
   ```

   명령에 오류가 표시되지 않으면 퍼블릭 키 파일이 유효합니다.

## 3단계: 사용자 지정 권한 부여자 리소스 및 권한 부여 생성
<a name="custom-auth-tutorial-authorizer"></a>

 AWS IoT 사용자 지정 권한 부여자는 이전 단계에서 생성된 모든 요소를 연결하는 리소스입니다. 이 단원에서는 사용자 지정 권한 부여자 리소스를 만들고 이전에 만든 Lambda 함수를 실행할 수 있는 권한을 부여합니다. AWS IoT 콘솔, AWS CLI또는 API를 사용하여 사용자 지정 권한 부여자 리소스를 생성할 수 있습니다 AWS .

이 자습서에서는 사용자 지정 권한 부여자를 하나만 생성하면 됩니다. 이 섹션에서는 AWS IoT 콘솔과를 사용하여를 생성하는 방법을 설명 AWS CLI하므로 가장 편리한 방법을 사용할 수 있습니다. 두 가지 방법으로 생성된 사용자 지정 권한 부여자 리소스 간에는 차이가 없습니다.

### 사용자 지정 권한 부여자 리소스 생성
<a name="custom-auth-tutorial-authorizer-resource"></a>

**다음 옵션 중 하나를 선택하여 사용자 지정 권한 부여자 리소스를 생성합니다.**
+ [AWS IoT 콘솔을 사용하여 사용자 지정 권한 부여자 생성](#create-custom-auth-in-console)
+ [AWS CLI를 사용하여 사용자 지정 권한 부여자 생성](#create-custom-auth-in-cli)

**사용자 지정 권한 부여자를 생성하려면(콘솔)**

1. [AWS IoT 콘솔의 사용자 지정 권한 부여자 페이지를](https://console.aws.amazon.com//iot/home#/authorizerhub) 열고 **권한 부여자 생성을** 선택합니다.

1. **권한 부여자**에서 다음 작업을 수행합니다.

   1. **권한 부여자 이름**에 **my-new-authorizer**를 입력합니다.

   1. **권한 부여자 상태**에서 **활성**을 선택합니다.

   1. **권한 부여자 함수**에서 앞서 생성한 Lambda 함수를 선택합니다.

   1. **토큰 검증 - 선택 사항**에서

      1. **토큰 검증**을 활성화합니다.

      1. **토큰 키 이름**에 **tokenKeyName**을 입력합니다.

      1. **키 추가**를 선택합니다.

      1. **키 이름**에 **FirstKey**를 입력합니다.

      1. **퍼블릭 키**에 `public-key.pem` 파일의 내용을 입력합니다. 파일로부터 `-----BEGIN PUBLIC KEY-----` 및 `-----END PUBLIC KEY-----`이(가) 있는 행을 포함해야 하며, 파일 내용에서 줄 바꿈, 캐리지 리턴 또는 기타 문자를 추가하거나 제거하지 마세요. 입력한 문자열은 이 예제와 유사해야 합니다.

         ```
         -----BEGIN PUBLIC KEY-----
         MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
         sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
         QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
         lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
         oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
         FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
         QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
         KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
         gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
         /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
         8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
         JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
         -----END PUBLIC KEY-----
         ```

1. **권한 부여자 생성**을 선택합니다.

1. 사용자 지정 권한 부여자 리소스가 생성된 경우 사용자 지정 권한 부여자 목록이 표시되고 새 사용자 지정 권한 부여자가 목록에 나타나며 다음 섹션으로 이동하여 테스트할 수 있습니다.

   오류가 표시되면 오류를 검토하고 사용자 지정 권한 부여자를 다시 만들고 항목을 다시 확인합니다. 각 사용자 지정 권한 부여자 리소스에는 고유한 이름이 있어야 합니다.

**사용자 지정 권한 부여자를 생성하려면(AWS CLI)**

1. 값을 `authorizer-function-arn` 및 `token-signing-public-keys`(으)로 대체한 후 다음 명령을 실행합니다.

   ```
   aws iot create-authorizer \
   --authorizer-name "my-new-authorizer" \
   --token-key-name "tokenKeyName" \
   --status ACTIVE \
   --no-signing-disabled \
   --authorizer-function-arn "arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function" \
   --token-signing-public-keys FirstKey="-----BEGIN PUBLIC KEY-----
   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
   sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
   QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
   lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
   oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
   FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
   QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
   KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
   gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
   /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
   8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
   JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
   -----END PUBLIC KEY-----"
   ```

**위치:**
   + `authorizer-function-arn` 값은 사용자 지정 권한 부여자에 대해 생성한 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.
   + `token-signing-public-keys` 값은 키 이름, **FirstKey** 및 `public-key.pem` 파일의 내용을 포함합니다. 파일로부터 `-----BEGIN PUBLIC KEY-----` 및 `-----END PUBLIC KEY-----`이(가) 있는 행을 포함해야 하며, 파일 내용에서 줄 바꿈, 캐리지 리턴 또는 기타 문자를 추가하거나 제거하지 마세요.

     참고: 퍼블릭 키 값을 변경하면 퍼블릭 키를 사용할 수 없게 되므로 퍼블릭 키를 입력하는 것은 주의해야 합니다.

1. 사용자 지정 권한 부여자가 생성되면 명령은 다음과 같은 새 리소스의 이름 및 ARN을 반환합니다.

   ```
   {
       "authorizerName": "my-new-authorizer",
       "authorizerArn": "arn:aws:iot:Region:57EXAMPLE833:authorizer/my-new-authorizer"
   }
   ```

   다음 단계에서 사용하도록 `authorizerArn` 값을 저장합니다.

   각 사용자 지정 권한 부여자 리소스에는 고유한 이름이 있어야 합니다.

### 사용자 지정 권한 부여자 리소스 권한 부여하기
<a name="custom-auth-tutorial-authorizer-permission"></a>

이 섹션에서는 방금 생성한 사용자 지정 권한 부여자 리소스에 Lambda 함수를 실행할 수 있는 권한을 부여합니다. 권한을 부여하려면 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 명령을 사용할 수 있습니다.

**를 사용하여 Lambda 함수에 권한 부여 AWS CLI**

1. 값을 삽입한 후 다음 명령을 입력합니다. 참고: `statement-id` 값은 고유해야 합니다. 이전에 이 자습서를 실행한 적이 있거나 `ResourceConflictException` 오류가 발생하면, `Id-1234`를 다른 값으로 대체합니다.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. 명령이 성공하면 이 예제와 같은 권한 문이 반환됩니다. 다음 단원을 계속하여 사용자 지정 권한 부여자를 테스트할 수 있습니다.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   명령이 성공하지 못하면 이 예제와 같은 오류가 반환됩니다. 계속하기 전에 오류를 검토하고 수정해야 합니다.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

## 4단계: test-invoke-authorizer를 호출하여 권한 부여자 테스트
<a name="custom-auth-tutorial-test"></a>

이 단원에서 정의된 모든 리소스를 사용해 명령줄에서 test-invoke-authorizer를 호출하여 권한 부여 성공 여부를 테스트합니다.

명령줄에서 권한 부여자를 호출할 때 `protocolData`이(가) 정의되지 않았으므로 권한 부여자는 항상 DENY 문서를 반환합니다. 그러나 이 테스트는 Lambda 함수를 완전히 테스트하지 않더라도 사용자 지정 권한 부여자와 Lambda 함수가 올바르게 구성되었는지 확인합니다.

**를 사용하여 사용자 지정 권한 부여자와 Lambda 함수를 테스트하려면 AWS CLI**

1. 이전 단계에서 생성한 `private-key.pem` 파일이 있는 디렉터리에서 다음 명령을 실행합니다.

   ```
   echo -n "tokenKeyValue" | openssl dgst -sha256 -sign private-key.pem | openssl base64 -A
   ```

   이 명령은 다음 단계에서 사용할 서명 문자열을 만듭니다. 서명 문자열은 다음과 같은 형태입니다.

   ```
   dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mn
   VB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeeh
   bQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjj
   szEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29V
   QJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuX
   f3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+K
   EWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFH
   xRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   이 서명 문자열을 복사하여 다음 단계에서 사용합니다. 여분의 문자를 포함하거나 남겨 두지 않도록 합니다.

1. 이 명령에서 `token-signature` 값을 이전 단계의 서명 문자열로 바꾸고 이 명령을 실행하여 권한 부여자를 테스트합니다.

   ```
   aws iot test-invoke-authorizer \
   --authorizer-name my-new-authorizer \
   --token tokenKeyValue \
   --token-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   명령이 성공적으로 실행되는 경우 이 예와 같이 사용자 지정 권한 부여자 함수가 생성한 정보가 반환됩니다.

   ```
   {
       "isAuthenticated": true,
       "principalId": "principalId",
       "policyDocuments": [
           "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Deny\",\"Resource\":\"arn:aws:iot:Region:57EXAMPLE833:*\"}]}"
       ],
       "refreshAfterInSeconds": 600,
       "disconnectAfterInSeconds": 3600
   }
   ```

   명령이 오류를 반환하면 오류를 검토하고 이 단원에서 사용한 명령을 다시 확인합니다.

## 5단계: Postman을 사용하여 MQTT 메시지 게시 테스트
<a name="custom-auth-tutorial-postman"></a>

1. 명령줄에서 디바이스 데이터 엔드포인트를 가져오려면 여기에 표시된 대로 [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html)를 호출합니다.

   ```
   aws iot describe-endpoint --output text --endpoint-type iot:Data-ATS
   ```

   이후 단계에서 *device\$1data\$1endpoint\$1address*로 사용할 수 있도록 이 주소를 저장합니다.

1. 새 Postman 창을 열고 새 HTTP POST 요청을 만듭니다.

   1. 컴퓨터에서 Postman 앱을 엽니다.

   1. Postman의 **파일** 메뉴에서 **새로 만들기…**를 선택합니다.

   1. **새로 만들기(New)** 대화 상자에서 **요청(Request)**을 선택합니다.

   1. 저장 요청에서

      1. **요청 이름**에서 **Custom authorizer test request**을(를) 입력합니다.

      1. **저장할 컬렉션 또는 폴더 선택:**에서 이 요청을 저장할 컬렉션을 선택하거나 만듭니다.

      1. ***collection\$1name*에 저장**을 선택합니다.

1. POST 요청을 생성하여 사용자 지정 권한 부여자를 테스트합니다.

   1. URL 필드 옆의 요청 메소드 선택기에서 **POST**를 선택합니다.

   1. URL 필드에서 이전 단계의 [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) 명령의 *device\$1data\$1endpoint\$1address*와 함께 다음 URL을 사용하여 요청에 대한 URL을 생성합니다.

      ```
      https://device_data_endpoint_address:443/topics/test/cust-auth/topic?qos=0&actionToken=allow
      ```

      이 URL에는 AWS IoT에 대한 액세스를 허용하는 정책 문서를 반환하도록 Lambda 함수에 지시하는 `actionToken=allow` 쿼리 파라미터가 포함됩니다. URL을 입력한 후 쿼리 파라미터가 Postman의 **Params** 탭에도 나타납니다.

   1. **Auth** 탭의 **유형(Type)** 필드에서 **No Auth**를 선택합니다.

   1. 헤더(Headers) 탭에서:

      1. **호스트** 키가 선택되어 있으면 이 키를 선택 취소하세요.

      1. 헤더 목록의 맨 아래에 이러한 새 헤더를 추가하고 새 헤더가 선택되었는지 확인합니다. **Host** 값을 *device\$1data\$1endpoint\$1address*로 바꾸고, **x-amz-customauthorizer-signature** 값을 이전 단원에서 **test-invoke-authorize** 명령과 함께 사용한 서명 문자열로 바꿉니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/custom-auth-tutorial.html)

   1. 본문(Body) 탭에서:

      1. 데이터 형식 옵션 상자에서 **원시(Raw)**를 선택합니다.

      1. 데이터 유형 목록에서 **JavaScript**를 선택합니다.

      1. 텍스트 필드에서 테스트 메시지에 대해 다음 JSON 메시지 페이로드를 입력합니다.

         ```
         {
             "data_mode": "test",
             "vibration": 200,
             "temperature": 40
         }
         ```

1. **전송(Send)**을 선택하여 요청을 전송합니다.

   요청이 성공적이면 다음을 반환합니다.

   ```
   {
       "message": "OK",
       "traceId": "ff35c33f-409a-ea90-b06f-fbEXAMPLE25c"
   }
   ```

   응답이 성공하면 사용자 지정 권한 부여자가에 대한 연결을 허용 AWS IoT 했고 테스트 메시지가의 브로커에 전송되었음을 나타냅니다 AWS IoT Core.

   오류가 반환되면 오류 메시지 *device\$1data\$1endpoint\$1address*, 서명 문자열 및 기타 헤더 값이 포함됩니다.

다음 단원에서 사용하도록 이 요청을 Postman에 유지합니다.

## 6단계: MQTT 테스트 클라이언트에서 메시지 보기
<a name="custom-auth-tutorial-testclient"></a>

이전 단계에서는 Postman을 사용하여 시뮬레이션된 디바이스 메시지를 AWS IoT 에 보냈습니다. 성공 응답은 사용자 지정 권한 부여자가 AWS IoT 에 대한 연결을 허용했으며 서 테스트 메시지가 AWS IoT Core의 브로커에게 전달되었음을 나타냅니다. 이 섹션에서는 AWS IoT 콘솔의 MQTT 테스트 클라이언트를 사용하여 다른 디바이스 및 서비스와 마찬가지로 해당 메시지의 메시지 내용을 확인합니다.

**사용자 지정 권한 부여자가 승인한 테스트 메시지를 보려면**

1.  AWS IoT 콘솔에서 [MQTT 테스트 클라이언트](https://console.aws.amazon.com//iot/home#/test)를 엽니다.

1. **주제 구독(Subscribe to topic)** 탭의 **주제 필터(Topic filter)**에 **test/cust-auth/topic**을(를) 입력합니다. 이는 이전 단원의 Postman 예제에서 사용된 메시지 주제입니다.

1. **구독**을 선택합니다.

   이 창은 다음 단계를 위해 계속 표시되도록 합니다.

1. Postman에서 이전 섹션에 대해 만든 요청에서 **전송(Send)**을 선택합니다.

   응답을 검토하여 성공했는지 확인합니다. 그렇지 않은 경우 이전 단원에서 설명한 대로 오류 문제를 해결하세요.

1. **MQTT 테스트 클라이언트**에서 메시지 주제를 표시하는 새 항목이 표시되고, 확장되면 Postman에서 전송한 요청의 메시지 페이로드가 표시됩니다.

   **MQTT 테스트 클라이언트**에서 메시지가 표시되지 않으면 다음 몇 가지를 확인해야 합니다.
   + Postman 요청이 성공적으로 반환되었는지 확인하세요. 가 연결을 AWS IoT 거부하고 오류를 반환하면 요청의 메시지가 메시지 브로커로 전달되지 않습니다.
   +  AWS IoT 콘솔을 여는 데 AWS 리전 사용되는 AWS 계정 및가 Postman URL에서 사용 중인와 동일한지 확인합니다.
   + 사용자 지정 권한 부여자에 적절한 엔드포인트를 사용하고 있는지 확인합니다. 기본 IoT 엔드포인트는 Lambda 함수와 함께 사용자 지정 권한 부여자를 사용하도록 지원하지 않을 수 있습니다. 그 대신, 도메인 구성을 사용하여 새 엔드포인트를 정의한 다음, 사용자 지정 권한 부여자에 대해 해당 엔드포인트를 지정할 수 있습니다.
   + **MQTT 테스트 클라이언트**에서 주제를 올바르게 입력했는지 확인하세요. 주제 필터는 대소문자를 구분하지 않습니다. 의심스러운 경우 주제를 구독할 수도 있습니다.이 **\$1** 주제는 메시지 브로커를 통과 AWS 계정 하고 콘솔을 여는 데 AWS 리전 사용되는 모든 MQTT 메시지를 구독합니다 AWS IoT .

## 7단계: 결과 및 다음 단계 검토
<a name="custom-auth-tutorial-review"></a>

**이 자습서에서는:**
+ Lambda 함수를 사용자 지정 권한 부여자 처리기로 만들었습니다.
+ 토큰 서명이 활성화된 상태에서 사용자 지정 권한 부여자를 만들었습니다.
+ **test-invoke-authorizer** 명령을 사용하여 사용자 지정 권한 부여자를 테스트했습니다.
+ [Postman](https://www.postman.com/)을 사용하여 MQTT 주제를 게시했고 사용자 지정 권한 부여자로 요청을 검증합니다.
+ **MQTT 테스트 클라이언트**를 사용하여 Postman 테스트에서 전송한 메시지를 보았습니다.

**다음 단계**  
Postman에서 일부 메시지를 전송해 사용자 지정 권한 부여자가 작동하는지 확인한 후 이 자습서의 다양한 측면을 변경하면 결과에 어떤 영향을 미치는지 실험해 보세요. 다음은 시작하는 데 도움이 될 몇 가지 예제입니다.
+ 더 이상 유효하지 않게 서명 문자열을 변경하여 무단 연결 시도가 어떻게 처리되는지 확인합니다. 이 오류 응답과 같은 오류 응답이 나타나야 하며 **MQTT 테스트 클라이언트**에 메시지가 나타나지 않아야 합니다.

  ```
  {
      "message": "Forbidden",
      "traceId": "15969756-a4a4-917c-b47a-5433e25b1356"
  }
  ```
+  AWS IoT 규칙을 개발하고 사용하는 동안 발생할 수 있는 오류를 찾는 방법에 대한 자세한 내용은 섹션을 참조하세요[모니터링 AWS IoT](monitoring_overview.md).

## 8단계: 정리
<a name="custom-auth-tutorial-cleanup"></a>

이 자습서를 반복하려면 일부 사용자 지정 권한 부여자를 제거해야 할 수도 있습니다. 는 한 번에 제한된 수의 사용자 지정 권한 부여자만 구성할 AWS 계정 수 있으며 기존 사용자 지정 권한 부여자를 제거하지 않고 새 권한 부여자를 추가하려고 할 `LimitExceededException` 때를 가져올 수 있습니다.

**사용자 지정 권한 부여자를 제거하려면(콘솔)**

1. [AWS IoT 콘솔의 사용자 지정 권한 부여자 페이지를](https://console.aws.amazon.com//iot/home#/authorizerhub) 열고 사용자 지정 권한 부여자 목록에서 제거할 사용자 지정 권한 부여자를 찾습니다.

1. 사용자 지정 권한 부여자 세부 정보 페이지를 열고 **작업** 메뉴에서 **편집**을 선택합니다.

1. **권한 부여자 활성화**의 선택을 취소한 다음 **업데이트**를 선택합니다.

   활성 상태인 동안에는 사용자 지정 권한 부여자를 삭제할 수 없습니다.

1. 사용자 지정 권한 부여자 세부 정보 페이지에서 **작업** 메뉴를 열고 **삭제**를 선택합니다.

**사용자 지정 권한 부여자를 제거하려면(AWS CLI)**

1. 설치한 사용자 지정 권한 부여자를 나열하고 삭제할 사용자 지정 권한 부여자의 이름을 찾습니다.

   ```
   aws iot list-authorizers 
   ```

1. `Custom_Auth_Name`을 삭제할 사용자 지정 권한 부여자의 `authorizerName`으로 바꾼 후 이 명령을 실행하여, 사용자 지정 권한 부여자를 `inactive`로 설정합니다.

   ```
   aws iot update-authorizer --status INACTIVE --authorizer-name Custom_Auth_Name
   ```

1. `Custom_Auth_Name`을 삭제할 사용자 지정 권한 부여자의 `authorizerName`으로 바꾼 후 이 명령을 실행하여 사용자 지정 권한 부여자를 삭제합니다.

   ```
   aws iot delete-authorizer --authorizer-name Custom_Auth_Name
   ```