AWS IoT 엔드포인트에서 자체 도메인 사용

10772 단어 awsIoTacm
2020/03/28 현재 이 기능은 공개 미리 보기 상태입니다. us-east-1 에서만 시도할 수 있습니다.

언제 필요?


  • MQTT 브로커를 제공하는 B2B 서비스를 수행 할 때 엔드 포인트 이름을 자체 도메인으로 만들려면
  • 이미 실행중인 MQTT 서버를 클라이언트 측 변경없이 AWS IoT로 대체하는 경우 (사용자 정의 제작자와 함께 사용)

  • 기본적으로이 슬라이드의 흐름을 따라 실현합니다.
    htps // d1. 아 wss c. 코 m / 에ぇ ぇ ts / 레이 ゔ ぇ t / 2019 / ぺぺ T_1_ 이오 T341-R1. pdf

    ACM에서 인증서 취득



    설정하려는 도메인 여기서는 iot.oxoxo.me에 대한 인증서를 검색합니다.
    aws acm request-certificate \
    --domain-name iot.oxoxo.me \
    --validation-method DNS \
    --idempotency-token 1234 \
    --subject-alternative-names iot.oxoxo.me \
    --options CertificateTransparencyLoggingPreference=ENABLED
    
    {
        "CertificateArn": "arn:aws:acm:us-east-1:<account-id>:certificate/92a2a701-ad12-4a2f-ab0a-b378721126e8"
    }
    

    AWS IoT의 도메인 설정


    aws iot create-domain-configuration  \ 
    --domain-configuration-name "myDomainConfigurationName" \ 
    --service-type "DATA"  \ 
    --domain-name "iot.oxoxo.me" \ 
    --server-certificate-arns arn:aws:acm:us-east-1:<account-id>:certificate/92a2a701-ad12-4a2f-ab0a-b378721126e8 \ 
    --region us-east-1
    
    {
        "domainConfigurationName": "myDomainConfigurationName",
        "domainConfigurationArn": "arn:aws:iot:us-east-1:<account-id>:domainconfiguration/myDomainConfigurationName/t9tri"
    }
    
    aws iot describe-endpoint --endpoint-type iot:Data-Beta --region us-east-1
    {
        "endpointAddress": "<random-id>-beta.iot.us-east-1.amazonaws.com"
    }
    

    CNAME 설정



    위에 표시된 엔드포인트를 향하는 CNAME을 만듭니다.
    자신의 환경에서는 DNS에 Route53을 사용하고 있으므로 다음과 같은 형태가 됩니다.



    test



    이상으로 설정 완료입니다.
    클라이언트 측을 만들어 시험해 갑니다. 이 기사 로 만든 환경을 유용합니다.

    실행할 때 자신의 끝점을 설정합니다.
    export ENDPOINT=iot.oxoxo.me
    

    이상입니다.

    참고로 v1의 SDK에서 시도하면 다음과 같은 오류가 발생했습니다.
    ssl.SSLError: ('Certificate subject does not match remote hostname.',)
    

    원인이 쫓지 않지만 내부적으로 443/ALPN을 사용한다고 전제입니까?
    Python 코드에서 Endpoint 포트를 443으로 변경하면 (WebSocket 사용) 피할 수 있습니다.

    (추가) 클라이언트 인증서가없는 MQTT 통신을 사용자 정의 작성자로 시도



    매우 힘없는 IoT 장치는 TLS 핸드 셰이크를 수행하는 사양을 가지고 있지 않을 수 있습니다. 반면에 클라이언트 인증서를 사용하지 않고도 관리형 MQTT 브로커로 AWS IoT를 사용하려는 경우도 있을 수 있습니다.
    그렇다고 해서, 커스텀 오서라이저 기능으로 그것을 실현해 봅니다. ID, 패스워드의 인증도 있습니다만, 여기에서는 뒤떨어져 인증 없이 챌린지합니다.
    시큐리티적으로는 전혀 추천 할 수 없습니다만, 데모등이라면 증명서 관리가 불필요하고 편리할지도 모릅니다.

    사용자 지정 제작자 기능은 지정된 Lambda에서 인증을 수행합니다.
    아래에서 Lambda를 작성했지만 깨끗하게 모든 것을 통과하려고합니다.

    IoTCustomAuthorizer
    import json
    
    def lambda_handler(event, context):
    
        ret = {
            "isAuthenticated": True,
            "principalId": "anonymous",
            "disconnectAfterInSeconds": 86400,
            "refreshAfterInSeconds": 300,
            "policyDocuments": [
                "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Allow\",\"Resource\":\"*\"}]}"
            ],
            "context": {
            }
        }
        return ret
    

    아래에서 제작자를 만듭니다.
    aws iot create-authorizer --authorizer-name test --authorizer-function-arn arn:aws:lambda:us-east-1:<account-id>:function:IoTCustomAuthorizer --signing-disabled --status ACTIVE --region us-east-1
    
    {
        "authorizerName": "test",
        "authorizerArn": "arn:aws:iot:us-east-1:<account-id>:authorizer/test"
    }
    

    그런 다음 AWS IoT 서비스에 Lambda를 두드리는 권한을 부여합니다.
    
    aws lambda add-permission --function-name IoTCustomAuthorizer \
    --principal iot.amazonaws.com \
    --source-arn arn:aws:iot:us-east-1:<account-id>:authorizer/test \
    --statement-id Id-123 \
    --action "lambda:InvokeFunction" \
    --region us-east-1
    
    {
        "Statement": "{\"Sid\":\"Id-123\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:<account-id>:function:IoTCustomAuthorizer\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:iot:us-east-1:<account-id>:authorizer/test\"}}}"
    }
    
    #AuthorizerをDomain Configurationに紐付ける
    aws iot update-domain-configuration --domain-configuration-name myDomainConfigurationName --region us-east-1 --authorizer-config defaultAuthorizerName=test,allowAuthorizerOverride=true
    
    # Lambdaが正しく動作するか確認
    aws iot test-invoke-authorizer --authorizer-name test --region us-east-1 --http-context '{}'
    
    

    MQTT Client에서 확인



    찾아보면 브라우저에서 MQTT를 시도할 수 있는 사이트가 여러가지 있었습니다.
    여기 하지만 심플했기 때문에 이번은 이쪽을 사용했습니다.
    Address 란에 wss://iot.oxoxo.me/mqtt

    좋은 웹페이지 즐겨찾기