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๋ฅผ ์๋ฏธํฉ๋๋ค.
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 ๋ช
๋ น์ ํธ์ถํ ๋ ์ฌ๋ฌผ ์ ํ์ ํจ๊ป ์ง์ ํ ์ ์์ต๋๋ค.
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๋ก ์ง์ ํ๋ฉด ์ธ์ฆ์๋ ์ฌ๋ฌผ์ ์ ์ผํ ์ธ์ฆ์๋ก ํ์ฉ๋๋ ๊ฒ์ผ๋ก ์ง์ ๋์ด ์ด ์ธ์ฆ์๋ฅผ ๋ค๋ฅธ ์ฌ๋ฌผ์ ์ํ ๋ณด์ ์ฃผ์ฒด๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค.
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)
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
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๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.