AWS IoT CoreλŠ” 슀마트 ν™ˆ λ˜λŠ” 곡μž₯, μ—λ„ˆμ§€ μ‹œμŠ€ν…œμ—μ„œ λ°œμƒν•˜λŠ” λ‹€μ–‘ν•œ μ‹œκ³„μ—΄ 데이터λ₯Ό μˆ˜μ§‘ν•  수 μžˆλŠ” 방법을 μ§€μ›ν•˜λŠ” IoT λ””λ°”μ΄μŠ€ κ΄€λ¦¬ν˜• μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. κΈ°μ‘΄ λ””λ°”μ΄μŠ€ 연동을 μœ„ν•œ AWS IoT Core κ΄€λ ¨ κΈ°λŠ₯은 AWS SDK for Java v1 λ²„μ „μœΌλ‘œ μž‘μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ— v1 버전 지원 μ’…λ£Œ μ˜ˆμ •μœΌλ‘œ 인해 AWS SDK for Java 2.x 둜 μ‘°κΈˆμ”© λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν•΄μ•Όν•©λ‹ˆλ‹€. λ”°λΌμ„œ, AWS IoT Core에 λŒ€ν•΄ μ•Œμ•„λ³΄λ©΄μ„œ AWS SDK for Java 2.x 기반의 μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ €κ³  ν•©λ‹ˆλ‹€. λ³Έ κΈ€μ—μ„œλŠ” IoT λ””λ°”μ΄μŠ€ μž…μž₯μ—μ„œ AWS IoT μ—”λ“œν¬μΈνŠΈλ‘œμ˜ 연결을 μˆ˜ν–‰ν•˜λŠ” 것이 μ•„λ‹Œ μ‹œμŠ€ν…œμ—μ„œ IoT λ””λ°”μ΄μŠ€λ₯Ό μœ„ν•œ μΈμ¦μ„œλ₯Ό λ°œκΈ‰ν•˜κΈ° μœ„ν•œ 일련의 과정을 μ•Œμ•„λ΄…λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ IAM μ‚¬μš©μž 생성

λ¨Όμ €, AWS IoT Core에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ AWSIoTFullAccess κΆŒν•œ 정책을 κ°€μ§€λŠ” μ‚¬μš©μžλ₯Ό λ§Œλ“€κ³  AWS CLI λ˜λŠ” 둜컬 μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ•‘μ„ΈμŠ€ ν‚€λ₯Ό λ°œκΈ‰ν•©λ‹ˆλ‹€. μΈν…”λ¦¬μ œμ΄μ˜ AWS Toolkit ν”ŒλŸ¬κ·ΈμΈμ˜ Open AWS Local Terminal 을 μ‚¬μš©ν•˜λ©΄ μ„ νƒν•œ AWS ν”„λ‘œνŒŒμΌ(AWS_PROFILE)이 ν™˜κ²½λ³€μˆ˜λ‘œ 적용된 터미널을 μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

AWS IoT Core μ—”λ“œν¬μΈνŠΈ

AWS IoT Core의 μ—”λ“œν¬μΈνŠΈλŠ” 컨트둀 ν”Œλ ˆμΈκ³Ό 데이터 μ˜μ—­μ„ μœ„ν•œ μ—”λ“œν¬μΈνŠΈλ‘œ κ΅¬λΆ„λ˜μ–΄ μ‚¬μš©λ˜λŠ”λ° AWS ν΄λΌμš°λ“œλ‘œ 데이터λ₯Ό μ „μ†‘ν•΄μ•Όν•˜λŠ” IoT λ””λ°”μ΄μŠ€λŠ” iot:Data-ATS μ—”λ“œν¬μΈνŠΈμ— X.509 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ‘œ 인증을 μˆ˜ν–‰ν•˜κ³  μ—°κ²°ν•˜κ²Œ λ©λ‹ˆλ‹€. iot:Data-ATS μ—μ„œ ATSλŠ” Amazon Trust Servicesλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

Terminal
PS> aws iot describe-endpoint --endpoint-type iot:Data-ATS { "endpointAddress": "[account-specific-prefix]-ats.iot.ap-northeast-2.amazonaws.com" }

X.509 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œμ— λŒ€ν•œ CA μΈμ¦μ„œ

AWS μ—μ„œ λ°œκΈ‰ν•΄μ£ΌλŠ” X.509 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλŠ” Amazon Trust Services둜 ꡐ차 κ²€μ¦λ˜λŠ” 루트 CA μΈμ¦μ„œλ‘œ μ„œλͺ…λ˜μ–΄ λ°œκΈ‰λ©λ‹ˆλ‹€. λŒ€λΆ€λΆ„ 루트 CA μΈμ¦μ„œκ°€ ν•„μš”μ—†μ§€λ§Œ CA μΈμ¦μ„œκ°€ ν•„μš”ν•œ IoT λ””λ°”μ΄μŠ€ ν™˜κ²½μ΄ μžˆμ„ 수 μžˆμœΌλ―€λ‘œ 이에 λŒ€ν•œ μ„œλ²„ 인증 κ°€μ΄λ“œλŠ” μ•Œμ•„λ‘˜ ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ›Ή μ½˜μ†”μ˜ 도메인 κ΅¬μ„±μ—μ„œ 데이터 ATS μ—”λ“œν¬μΈνŠΈμ—μ„œ μ‚¬μš©μ€‘μΈ λ³΄μ•ˆ 정책도 확인해보면 μ’‹μŠ΅λ‹ˆλ‹€.

Data-ATS μ—”λ“œν¬μΈνŠΈμ— μ—°κ²°ν•˜κΈ° μœ„ν•œ X.509 μΈμ¦μ„œ λ°œκΈ‰

CreateKeysAndCertificate λͺ…λ ΉμœΌλ‘œ 2048 λΉ„νŠΈ 길이의 RSA ν‚€ νŽ˜μ–΄μ™€ X.509 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, setAsActive νŒŒλΌλ―Έν„°λ‘œ λΉ„ν™œμ„±ν™” μƒνƒœμΈ μΈμ¦μ„œλ₯Ό λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ 사물에 μΈμ¦μ„œλ₯Ό μ—°κ²°ν•˜κ³ λ‚˜μ„œ μ‹€μ œλ‘œ IoT λ””λ°”μ΄μŠ€μ—μ„œ 인증을 μˆ˜ν–‰ν•˜κΈ° 전에 μ‹œμŠ€ν…œ 화면을 톡해 μΈμ¦μ„œ μƒνƒœλ₯Ό ν™œμ„±ν™”ν•  수 μžˆλ„λ‘ μ œκ³΅ν•˜λŠ”κ²Œ λ³΄μ•ˆ 상 더 쒋을 순 μžˆκ² λ„€μš”.

aws iot create-keys-and-certificate --no-set-as-active --certificate-pem-outfile cert.pem --public-key-outfile pub.key --private-key-outfile priv.key
{
   "certificateArn": "The ARN of the certificate",
   "certificateId": "The ID of the certificate",
   "certificatePem": "The certificate data, in PEM format.",
   "keyPair": { 
      "PrivateKey": "The private key",
      "PublicKey": "The public key"
   }
}

IoT λ ˆμ§€μŠ€νŠΈλ¦¬ 사물 μœ ν˜• β€’ 사물 생성

λ””λ°”μ΄μŠ€μ— λŒ€ν•œ 사물 μœ ν˜•μ„ μƒμ„±ν•˜κ³  사물 μœ ν˜•κ³Ό ν•¨κ»˜ 사물을 λ“±λ‘ν•©λ‹ˆλ‹€. 사물 μœ ν˜•μ΄ μ„€μ •λœ 사물은 속성을 3개 이상 지정할 수 μžˆμœΌλ―€λ‘œ 사물과 사물 μœ ν˜•μ„ ν•¨κ»˜ μƒμ„±ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. CreateThingType λͺ…λ ΉμœΌλ‘œ 사물 μœ ν˜•μ„ 생성할 수 있고 CreateThing λͺ…령을 ν˜ΈμΆœν•  λ•Œ 사물 μœ ν˜•μ„ ν•¨κ»˜ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

Terminal
PS> aws iot create-thing-type --thing-type-name Computer { "thingTypeName": "Computer", "thingTypeArn": "arn:aws:iot:ap-northeast-2:[account-id]:thingtype/Computer", "thingTypeId": "5c6a1c6c-93e6-4d57-82d3-047f1c267ea6" } PS> aws iot create-thing --thing-name PC --thing-type-name Computer { "thingName": "PC", "thingArn": "arn:aws:iot:ap-northeast-2:[account-id]:thing/PC", "thingId": "2439524c-278c-486d-b74b-1af1acc8fd63" }

μƒμ„±λœ 사물 이름은 λ³€κ²½ν•  수 μ—†μœΌλ―€λ‘œ 사물을 생성할 λ•Œμ—λŠ” λ””λ°”μ΄μŠ€μ— λŒ€ν•΄ UUID와 같은 λ³„λ„μ˜ μ‹λ³„μžλ₯Ό λ°œκΈ‰ν•˜κ³  μƒμ„±ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

사물에 X.509 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ 주체 등둝

X.509 μΈμ¦μ„œλ₯Ό 사물에 μ—°κ²°ν•  λ•Œμ—λŠ” λ³΄μ•ˆ 상 사물과 μΈμ¦μ„œ κ°„ 관계λ₯Ό μœ μΌν•˜κ²Œ μœ μ§€ν•˜μ—¬ λ…μ ν•˜λ„λ‘ κ΅¬μ„±ν•˜λŠ”κ²Œ μ’‹λ‹€κ³  ν•˜λ‚˜ 슀마트 ν™ˆμ΄λ‚˜ 곡μž₯처럼 ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” λ””λ°”μ΄μŠ€κ°€ μ—¬λŸ¬κ°œμΈ 경우 μ‚¬μ΄νŠΈμ— λŒ€ν•œ μΈμ¦μ„œλ₯Ό μ„œλ‘œ λ‹€λ₯Έ λ””λ°”μ΄μŠ€μ˜ 사물이 κ³΅μœ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, μΈμ¦μ„œ 관리 기쀀에 λŒ€ν•œ 뢀뢄은 μ‹œμŠ€ν…œ λͺ©μ μ— 따라 μ„ νƒν•˜λ©΄ λ©λ‹ˆλ‹€. AttachThingPrincipal λͺ…령을 ν˜ΈμΆœν•  λ•Œ thingPrincipalType을 EXCLUSIVE_THING둜 μ§€μ •ν•˜λ©΄ μΈμ¦μ„œλŠ” 사물에 μœ μΌν•œ μΈμ¦μ„œλ‘œ ν™œμš©λ˜λŠ” κ²ƒμœΌλ‘œ μ§€μ •λ˜μ–΄ 이 μΈμ¦μ„œλ₯Ό λ‹€λ₯Έ 사물을 μœ„ν•œ λ³΄μ•ˆ 주체둜 등둝할 수 μ—†μŠ΅λ‹ˆλ‹€.

Terminal
PS> aws iot create-keys-and-certificate { "certificateArn": "arn:aws:iot:ap-northeast-2:[account-id]:cert/8f8538927603f4dfe5fb374fc383211a966cc6f74a1ba70121ef185f9cdf67f3", "certificateId": "8f8538927603f4dfe5fb374fc383211a966cc6f74a1ba70121ef185f9cdf67f3", ... } PS> aws iot attach-thing-principal --thing-name PC --principal arn:aws:iot:ap-northeast-2:[account-id]:cert/8f8538927603f4dfe5fb374fc383211a966cc6f74a1ba70121ef185f9cdf67f3

사물에 λŒ€ν•œ λ³΄μ•ˆ μ£Όμ²΄λŠ” Amazon Cognito ID λ˜λŠ” X.509 μΈμ¦μ„œκ°€ 되며 μœ„ 경우 μΈμ¦μ„œ ARN을 λ³΄μ•ˆ 주체둜 μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

사물에 λ“±λ‘λœ μΈμ¦μ„œ ν•΄μ œ 및 회수

λ³΄μ•ˆμ μΈ 이슈 λ˜λŠ” 주기적인 관리 일정에 μ˜ν•˜μ—¬ 사물에 μ—°κ²°λœ μΈμ¦μ„œλ₯Ό ꡐ체λ₯Ό μœ„ν•΄ κΈ°μ‘΄ μΈμ¦μ„œλ₯Ό νšŒμˆ˜ν•˜λ €λ©΄ DetachThingPrincipal λͺ…령을 μˆ˜ν–‰ν•˜μ—¬ 사물에 μ—°κ²°λœ μΈμ¦μ„œλ₯Ό λ¨Όμ € ν•΄μ œν•©λ‹ˆλ‹€. κ·Έλ¦¬κ³ λ‚˜μ„œ UpdateCertificate λͺ…λ ΉμœΌλ‘œ μΈμ¦μ„œμ˜ μƒνƒœλ₯Ό μ·¨μ†Œ(REVOKED)둜 λ³€κ²½ν•˜λ©΄ λ©λ‹ˆλ‹€.

Terminal
PS> aws iot update-certificate --certificate-id 8f8538927603f4dfe5fb374fc383211a966cc6f74a1ba70121ef185f9cdf67f3 --new-status REVOKED

AWS IoT SDK v2 기반 예제 μ½”λ“œ

AWS IoT λ””λ°”μ΄μŠ€λ₯Ό μœ„ν•œ 일련의 과정을 AWS IoT examples using AWS CLIλ₯Ό μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” AWS IoT SDK for Java 2.xλ₯Ό μ‚¬μš©ν•œ 예제λ₯Ό μ°Έκ³ ν•΄μ„œ AWS IoT SDK for Java 2.x 기반의 μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 예제 μ½”λ“œλŠ” kdevkr/aws-iot-core-demoμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ¨Όμ €, 예제 μ½”λ“œμ—μ„œ IotClient μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ ProfileCredentialsProvider λ₯Ό μ‚¬μš©ν•˜μ—¬ iot-core ν”„λ‘œνŒŒμΌμ„ 직접 μ„€μ •ν•  수 μžˆμ§€λ§Œ ν”„λ‘œλ•μ…˜ κΈ°μ€€μ—μ„œλŠ” ν¬λ ˆλ΄μ…œ ν”„λ‘œλ°”μ΄λ” 체인 λ°©μ‹μœΌλ‘œ λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ ν¬λ ˆλ΄μ…œμ„ μ‘°νšŒν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μΈν…”λ¦¬μ œμ΄μ˜ Run Configuration μ—μ„œ ν™˜κ²½ λ³€μˆ˜μ— AWS_PROFILE을 μ„€μ •ν•˜λ©΄ iot-core ν”„λ‘œνŒŒμΌμ„ μ‰½κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. AWS Toolkit for IntelliJ IDEA ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ AWS Connection μ„€μ •μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν™˜κ²½μ— λ§žλŠ” IAM ν”„λ‘œνŒŒμΌλ‘œ μ‹€ν–‰ν•˜κ³  μžˆλŠ”λ° μœˆλ„μš°μ—μ„œλŠ” μ„ νƒν•œ ν”„λ‘œνŒŒμΌμ΄ λ°˜μ˜λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ ν™•μΈλ˜μ–΄ AWS_PROFILE ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

IoT λ””λ°”μ΄μŠ€ μΈμ¦μ„œ λ³΄μ•ˆ μ •μ±…

IoT λ””λ°”μ΄μŠ€μ— IAM κΆŒν•œ μ •μ±…μ²˜λŸΌ λ³„λ„λ‘œ μ œκ³΅ν•˜λŠ” AWS IoT Core Policy을 μ„€μ •ν•˜μ—¬ MQTT μ—°κ²°λΆ€ν„° λ©”μ‹œμ§€ μ†‘μˆ˜μ‹  등에 λŒ€ν•œ λ³΄μ•ˆ 정책을 μˆ˜λ¦½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 사물에 μ—°κ²°λœ X.509 μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜λŠ” IoT λ””λ°”μ΄μŠ€κ°€ μ˜¬λ°”λ₯Έ ν΄λΌμ΄μ–ΈνŠΈ μ•„μ΄λ””λ‘œ 연결을 ν•  수 있게 μ œν•œν•˜κ±°λ‚˜ ν—ˆμš©λœ 아이피 λŒ€μ—­μ—μ„œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • aws:SourceIp - λ©”μ‹œμ§€ λΈŒλ‘œμ»€μ— μ—°κ²°λ˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ 아이피에 λŒ€ν•œ μ •μ±… λ³€μˆ˜
  • iot:ClientId - MQTT ν΄λΌμ΄μ–ΈνŠΈ 아이디에 λŒ€ν•œ μ •μ±… λ³€μˆ˜
  • iot:CertificateId - X.509 μΈμ¦μ„œμ— λŒ€ν•œ μ •μ±… λ³€μˆ˜
  • IoT Core μž‘μ—… λ¦¬μ†ŒμŠ€μ˜ Amazon Resource Names (ARNs)

IoT λ””λ°”μ΄μŠ€ μ—°κ²° μƒνƒœ

AWS IoT ν”Œλ¦Ώ 인덱싱(Fleet Indexing)μ—μ„œ 사물 연결에 λŒ€ν•œ 인덱싱을 ν™œμ„±ν™”ν•˜λ©΄ IoT λ””λ°”μ΄μŠ€μ˜ κ°œλ³„ μ—°κ²° μƒνƒœλ₯Ό GetThingConnectivityData λͺ…λ ΉμœΌλ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 사물을 λ§Œλ“€κ³  λ‚˜μ„œ 연결을 μ‹œλ„ν•œ 적이 μ—†λŠ” 경우의 μƒνƒœλ₯Ό λ³΄μ—¬μ£ΌλŠ”λ° λ§Œμ•½, λ””λ°”μ΄μŠ€ ν”Œλ¦Ώ 인덱싱을 ν™œμ„±ν™”ν•˜μ§€ μ•Šμ€ μƒνƒœλΌλ©΄ AWS_Things 인덱슀λ₯Ό 찾을 수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ˜ν•œ, AWS CLI 에 get-thing-connectivity-data ν•˜μœ„ λͺ…령이 μ—†λŠ” 경우 2.23 μ΄μƒμ˜ λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈ ν•˜μ„Έμš”.

PS> aws iot get-thing-connectivity-data --thing-name PC
{
    "thingName": "PC",
    "connected": false,
    "timestamp": "1970-01-01T09:00:00+09:00",
    "disconnectReason": "UNKNOWN"
}

λ‹€μŒμ—λŠ” IoT λ””λ°”μ΄μŠ€ μž…μž₯μ—μ„œ AWS IoT Device SDK for Java v2λ₯Ό μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.