밤 늦게까지 여는 카페

[AWS IoT Core] 프로비저닝 템플릿 - 프로비저닝 단계에서 정책 여러 개 연결하기 본문

aws

[AWS IoT Core] 프로비저닝 템플릿 - 프로비저닝 단계에서 정책 여러 개 연결하기

Jㅐ둥이 2024. 4. 22. 20:14
반응형

안녕하세요. 이번에는 AWS IoT Core 프로비저닝 템플릿을 사용하면서 헤맸던 내용을 기록하려고 합니다.

 

프로비저닝 템플릿은 AWS IoT Core에 디바이스를 등록하는 복잡한 과정을 간단하게 진행할 수 있도록 도와주는 기능입니다.

 

혹시 AWS IoT Core를 사용하면서 디바이스 프로비저닝 과정에서 정책 크기 제한으로 어려움을 겪고 있다면 도움이 될 거에요!

TL-DR

  • AWS IoT Core의 정책은 정책은 최대 2048자이니 주의!
  • 프로비저닝 템플릿에 여러 개의 policy 타입 리소스를 생성하면 됩니다.
  • 아래 예시처럼 Resource 하위 객체의 Type 값이 중요한 것이지 객체의 이름이 중요한 것이 아닙니다!
{
    "Parameters": { ... },
    "Resources": {
        "thing": { ... },
        "certificate": { ... },
        "policy1": {   # 첫 번째 정책
            "Type": "AWS::IoT::Policy",
            "Properties": {
                "PolicyDocument": "..."
            }
        },
        "policy2": {   # 두 번째 정책
            "Type": "AWS::IoT::Policy",
            "Properties": {
                "PolicyDocument": "..."
            }
        }

    }
}

 

1. AWS IoT Core 프로비저닝 템플릿이 뭐에요?

프로비저닝이라고 하면 일반적으로 사용자와 시스템이 자원을 사용할 수 있도록 시스템 인프라를 설정하는 것을 뜻합니다.

예전에 공부했던 terraform이 대표적인 인프라 프로비저닝 툴입니다.
링크: terraform이 뭘까? - IaC! 인프라도 형상 관리해야죠!

 

 

AWS IoT Core에서 말하는 프로비저닝은 디바이스를 AWS IoT Core에 등록하는 과정을 뜻합니다.

 

그렇다면 프로비저닝 템플릿은 무엇일까요?!

 

프로비저닝 템플릿은 AWS IoT Core에 디바이스를 등록하는 과정을 자동화하고, 그 과정에서 필요한 리소스들을 일관된 방식으로 생성할 수 있게 해주는 템플릿입니다.

  • 프로비저닝 템플릿이 없다면 디바이스를 등록하기 위해서 1) Thing을 생성하고, 2) 인증서를 생성하고, 3) 인증서에 정책을 연결하고, 4) Thing에 인증서를 연결하고, ... 등의 작업을 하나하나 해줘야 합니다 ㅜㅠ

2. AWS IoT Core 프로비저닝 템플릿은 어떻게 작성하는 거에요?

프로비저닝 템플릿은 ParametersResources로 구성됩니다.

  • Parameters
    • 디바이스 등록 시 필요한 파라미터들을 정의합니다.
    • 프로비저닝을 진행할 때 디바이스의 이름, 타입과 같이 인자로 받아야 하는 값이 있다면 파라미터에 등록해서 사용합니다.
  • Resources
    • 디바이스 등록 과정에서 생성되어야 하는 AWS 리소스들을 정의합니다.
    • thing, 인증서, 정책 3가지 유형이 있습니다.

AWS IoT Core 가이드 문서에서 제공하는 프로비저닝 템플릿 예시를 같이 보시죠.

{
   "Parameters":{
      "AWS::IoT::Certificate::CommonName":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::SerialNumber":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Country":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Id":{
         "Type":"String"
      }
   },
   "Resources":{
      "thing":{
         "Type":"AWS::IoT::Thing",
         "Properties":{
            "ThingName":{
               "Ref":"AWS::IoT::Certificate::CommonName"
            },
            "AttributePayload":{
               "version":"v1",
               "serialNumber":{
                  "Ref":"AWS::IoT::Certificate::SerialNumber"
               }
            },
            "ThingTypeName":"lightBulb-versionA",
            "ThingGroups":[
               "v1-lightbulbs",
               {
                  "Ref":"AWS::IoT::Certificate::Country"
               }
            ]
         },
         "OverrideSettings":{
            "AttributePayload":"MERGE",
            "ThingTypeName":"REPLACE",
            "ThingGroups":"DO_NOTHING"
         }
      },
      "certificate":{
         "Type":"AWS::IoT::Certificate",
         "Properties":{
            "CertificateId":{
               "Ref":"AWS::IoT::Certificate::Id"
            },
            "Status":"ACTIVE"
         }
      },
      "policy":{
         "Type":"AWS::IoT::Policy",
         "Properties":{
            "PolicyDocument":"{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
         }
      }
   }
}

 

3. 그래서 뭐가 문제였죠?

AWS IoT Core를 사용하다보니 정책에 이것 저것 조건이 붙기 시작했고, 최대 크기인 2048자가 넘게 되었습니다.

추가로 정책을 붙여야 해서 프로비저닝 템플릿을 어떻게 수정해야 하는지 찾아봤습니다.

 

위의 예시를 보면 Resources에서 정책을 다루는 오브젝트의 키 값이 policy입니다.

하필 저는 키 값이 policy여야만 정책인줄 알았고, 그래서 정책을 하나만 만들 수 있는 걸로 이해했습니다(이런 바보 ㅜㅠ).

 

 

하지만 키 값은 그저 논리적인 이름일 뿐이라서 policy1, policy2 혹은 asdf로 바꿔도 아무 문제가 없는 것입니다.

키 값은 그저 논리적인 이름일 뿐입니다 ㅜㅠ

 

한참을 찾고 나서야 여기까지 도달할 수 있었습니다... 여러분은 이런 간단한 걸로 시간 낭비하지 마세요! 흑흑

반응형