Lambda 권한 부여자 문제 해결 - AWS IoT Core

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

Lambda 권한 부여자 문제 해결

이 주제에서는 사용자 지정 인증 워크플로에서 문제를 일으킬 수 있는 일반적인 문제와 이를 해결하기 위한 단계를 안내합니다. 문제를 가장 효과적으로 해결하려면 에 대한 CloudWatch 로그를 AWS IoT Core 활성화하고 로그 수준을 DEBUG로 설정합니다. AWS IoT Core 콘솔 (https://console.aws.amazon.com/iot/) 에서 CloudWatch 로그를 활성화할 수 있습니다. AWS IoT Core에 대해 로그를 활성화 및 구성하는 자세한 내용은 로깅을 구성합니다 AWS IoT . 단원을 참조하세요.

참고

로그 수준을 오랫동안 DEBUG로 두면 대량의 로깅 데이터가 CloudWatch 저장될 수 있습니다. 이로 인해 CloudWatch 요금이 인상될 수 있습니다. 특정 사물 그룹의 디바이스에 대해서만 상세도를 높이도록 리소스 기반 로깅을 사용하는 것이 좋습니다. 리소스 기반 로깅에 대한 자세한 내용은 로깅을 구성합니다 AWS IoT . 단원을 참조하세요. 또한 문제 해결이 완료되면 로그 수준의 상세도를 낮추세요.

문제 해결을 시작하기 전에 사용자 지정 인증 프로세스를 자세히 볼 수 있도록 사용자 지정 인증 워크플로 이해을(를) 검토합니다. 이렇게 하면 문제의 원인을 찾을 위치를 파악하는 데 도움이 됩니다.

이 주제에서는 다음과 같은 두 가지 조사 영역에 대해 설명합니다.

  • 권한 부여자의 Lambda 함수와 관련된 문제.

  • 디바이스와 관련된 문제.

권한 부여자의 Lambda 함수에서 문제 확인

장치의 연결 시도가 Lambda 함수를 호출하는지 확인하려면 다음 단계를 수행하세요.

  1. 권한 부여자와 연결된 Lambda 함수를 확인합니다.

    DescribeAuthorizerAPI를 호출하거나 AWS IoT Core 콘솔의 보안 섹션에서 원하는 권한 부여자를 클릭하여 이 작업을 수행할 수 있습니다.

  2. Lambda 함수의 호출 지표를 확인합니다. 이렇게 하려면 다음 단계를 수행하세요.

    1. AWS Lambda 콘솔 (https://console.aws.amazon.com/lambda/) 을 열고 권한 부여자와 연결된 함수를 선택합니다.

    2. 모니터링 탭을 선택하고 문제와 관련된 시간 프레임에 대한 지표를 봅니다.

  3. 호출이 보이지 않는 경우 Lambda 함수를 호출할 AWS IoT Core 권한이 있는지 확인하십시오. 호출이 표시되면 다음 단계로 건너뜁니다. Lambda 함수에 필요한 권한이 있는지 확인하려면 다음 단계를 수행하세요.

    1. 콘솔에서 함수의 권한 탭을 선택합니다. AWS Lambda

    2. 페이지 하단에서 리소스 기반 정책 단원을 찾습니다. Lambda 함수에 필요한 권한이 있는 경우 정책은 다음 예와 같습니다.

      { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "Id123", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName" }, "StringEquals": { "AWS:SourceAccount": "111111111111" } } } ] }
    3. 이 정책은 주체에게 기능에 대한 InvokeFunction 권한을 부여합니다. AWS IoT Core 표시되지 않으면 AddPermissionAPI를 사용하여 추가해야 합니다. 다음 예에서는 AWS CLI을(를) 사용하여 이 작업을 수행하는 방법을 보여줍니다.

      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
  4. 호출이 표시되면 오류가 없는지 확인합니다. 오류는 Lambda 함수가 해당 함수로 전송하는 연결 이벤트를 AWS IoT Core 제대로 처리하지 않고 있음을 나타낼 수 있습니다.

    Lambda 함수에서 이벤트를 처리하는 방법에 대한 자세한 내용은 Lambda 함수 정의 단원을 참조하세요. AWS Lambda 콘솔 (https://console.aws.amazon.com/lambda/) 의 테스트 기능을 사용하여 함수의 테스트 값을 하드 코딩하여 함수가 이벤트를 올바르게 처리하는지 확인할 수 있습니다.

  5. 오류 없이 호출이 표시되지만 디바이스가 연결할 수 없거나 메시지를 게시, 구독 및 수신할 수 없는 경우 Lambda 함수가 반환하는 정책이 디바이스가 수행하려는 작업에 대한 권한을 부여하지 않는 문제일 수 있습니다. 함수가 반환하는 정책에 문제가 있는지 확인하려면 다음 단계를 수행하세요.

    1. Amazon CloudWatch Logs Insights 쿼리를 사용하여 짧은 시간 동안 로그를 스캔하여 실패 여부를 확인합니다. 다음 예제 쿼리는 타임스탬프별로 이벤트를 정렬하고 실패를 찾습니다.

      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"
    2. Lambda 함수를 업데이트하여 반환되는 데이터와 함수를 AWS IoT Core 트리거하는 이벤트를 기록하십시오. 이러한 로그를 사용하여 함수가 만드는 정책을 검사할 수 있습니다.

  6. 오류 없이 호출이 표시되지만 디바이스가 연결할 수 없거나 메시지를 게시, 구독 및 수신할 수 없는 경우 Lambda 함수가 제한 시간을 초과했기 때문일 수 있습니다. 사용자 지정 권한 부여자에 대한 Lambda 함수 제한 시간은 5초입니다. CloudWatch 로그 또는 지표에서 함수 지속 시간을 확인할 수 있습니다.

디바이스 문제 조사

Lambda 함수를 호출하거나 함수가 반환하는 정책에 문제가 없으면 디바이스의 연결 시도에 문제가 있는지 확인합니다. 잘못된 연결 요청으로 인해 권한 부여자가 AWS IoT Core 트리거되지 않을 수 있습니다. TLS 및 애플리케이션 계층 모두에서 연결 문제가 발생할 수 있습니다.

가능한 TLS 계층 문제:

  • 고객은 모든 사용자 지정 인증 요청에서 호스트 이름 헤더 (HTTP, MQTT over WebSockets) 또는 서버 이름 표시 TLS 확장 (HTTP, MQTT over WebSockets, MQTT) 을 전달해야 합니다. 두 경우 모두 전달된 값은 계정의 데이터 엔드포인트 중 하나와 일치해야 합니다. AWS IoT Core 이러한 엔드포인트는 다음 CLI 명령을 수행할 때 반환되는 엔드포인트입니다.

    • aws iot describe-endpoint --endpoint-type iot:Data-ATS

    • aws iot describe-endpoint --endpoint-type iot:Data(레거시 VeriSign 엔드포인트용)

  • MQTT 연결에서 사용자 지정 인증을 사용하는 디바이스가 mqtt 값의 ALPN(Application Layer Protocol Negotiation) TLS 확장을 전달해야 합니다.

  • 사용자 지정 인증은 현재 포트 443에서만 사용할 수 있습니다.

가능한 애플리케이션 계층 문제:

  • 서명이 활성화된 경우(signingDisabled 필드가 false인 경우) 다음 서명 문제를 찾습니다.

    • 토큰 서명을 x-amz-customauthorizer-signature 헤더 또는 쿼리 문자열 파라미터로 전달하고 있는지 확인합니다.

    • 서비스가 토큰이 아닌 다른 값에 서명하고 있지 않은지 확인합니다.

    • 권한 지정자의 token-key-name 필드에 지정한 헤더 또는 쿼리 파라미터로 토큰을 전달하는지 확인합니다.

  • x-amz-customauthorizer-name 헤더 또는 쿼리 문자열 파라미터로 전달한 권한 부여자 이름이 유효하거나 계정에 대해 기본 권한 부여자가 정의되어 있어야 합니다.