IoT ๋๋ฐ์ด์ค ์ฐ๊ฒฐ์ ๋ํด ์ง์ ์ ์ผ๋ก ๋ด๋นํ๋ ๊ฒฝํ์ ์์ง๋ง IoT Core ์ปจํธ๋กค ํ๋ ์ธ ์์ ์ ์ด์ด์ IoT ๋๋ฐ์ด์ค์ ๋ํ AWS IoT Device SDK for Java v2์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋๋ถ๋ถ์ ์ค๋ฌด์์ IoT ๋๋ฐ์ด์ค์ ๋ํ SDK๋ C ๋๋ ํ์ด์ฌ์ผ๋ก ์์ฑ๋ ๊ฒ์ ํ์ฉํ๊ฒ ์ง๋ง ์ด์ ๋ํ ๊ฒฝํ์ ์์ผ๋ฉฐ C ์ ํ์ด์ฌ์ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ ์๋๋ฏ๋ก ์๋ฐ SDK๋ก ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
IoT ๋๋ฐ์ด์ค ๋ฐ์ดํฐ ์๋ํฌ์ธํธ โ
IoT ๋๋ฐ์ด์ค์์ X.509 ํด๋ผ์ด์ธํธ ์ธ์ฆ์
์ ํจ๊ป MQTT ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ AWS IoT ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ฐ๊ฒฐํ ๋๋ Data-ATS
์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด ์๋ํฌ์ธํธ ์ฃผ์๋ AWS IoT Core์ DescribeEndpoint
๋ช
๋ น์ผ๋ก ํ์ธํ ์ ์์์ง๋ง ์์๋ก ๋ณ๊ฒฝ๋๋ ์ ๋ณด๊ฐ ์๋๋ฏ๋ก ์น ์ฝ์์์ ํ์ธํด๋ ๋ฌด๋ฐฉํ๋ฏ๋ก IoT ์ฐ๊ณ ์์คํ
์ ํตํด ํธ์คํธ ์ฃผ์, ๊ฐ์ธํค ํ์ผ, X.509 ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ๊ทธ๋ฆฌ๊ณ ๋ฃจํธ CA ์ธ์ฆ์ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ฒ ๋ฉ๋๋ค.
๋ฉ์์ง ๋ธ๋ก์ปค ์ฐ๊ฒฐ ๊ถํ โ
์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์์ด๋๋ ์ฌ๋ฌผ ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉํ๋๋ก ๋ณด์ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค. ๋ฐ๋ผ์, MQTT ํ๋กํ ์ฝ์ ์ฌ์ฉํ ๋ X.509 ํด๋ผ์ด์ธํธ ์ธ์ฆ์์ ๋ฑ๋ก๋ ์ฐ๊ฒฐ ์ ์ฑ ์ผ๋ก ์ ์๋ ํด๋ผ์ด์ธํธ ์์ด๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์์ด๋๋ฅผ ์ฌ๋ฌผ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ ์ด์ ๋ MQTT ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋์ผํ ํด๋ผ์ด์ธํธ ์์ด๋๋ก ์ฐ๊ฒฐํ ์ ์์ผ๋ฏ๋ก ์ด์ ์ฐ๊ฒฐ์ด ํด์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:ap-northeast-2:[account-id]:client/${iot:Connection.Thing.ThingName}"
}
]
}
๋๋ฐ์ด์ค ์ฐ๊ฒฐ ์ํ โ
ํ๋ฆฟ ์ธ๋ฑ์ฑ์ ์ฌ๋ฌผ ์ฐ๊ฒฐ์ ํ์ฑํํ๋ฉด IoT Core ์์ IoT ๋๋ฐ์ด์ค ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ฒ ๋ฉ๋๋ค. ํ๋ฆฟ ์ธ๋ฑ์ฑ์ผ๋ก ์ฌ๋ฌผ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธ
ํ๊ธฐ ์ํด์๋ MQTT ํด๋ผ์ด์ธํธ ์์ด๋๋ฅผ ์ฌ๋ฌผ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค. ์์, ๋ฉ์์ง ๋ธ๋ก์ปค ์ฐ๊ฒฐ ๊ถํ์์ ํด๋ผ์ด์ธํธ ์์ด๋๋ฅผ ์ฌ๋ฌผ ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉํด์ผํ๋ ์ด์ ๊ฐ ๋๊ธฐ๋ ํฉ๋๋ค. ์ฐ๊ฒฐ ์ํ์ ๋ํ ์์ธ ์ด์ ๋ ์น ์ฝ์์ ์ฌ๋ฌผ ์ฐ๊ฒฐ์ฑ API ํ
์คํธ
๋๋ ์ฌ๋ฌผ ํ๋ ์ด๋ ฅ
์์ ํ์ธํ ์ ์์ต๋๋ค.
IoT Device Java SDK v2 ๊ธฐ๋ฐ ์ฐ๊ฒฐ ์ฝ๋ โ
AWS IoT Device SDK๋ก IoT ๋๋ฐ์ด์ค์์ AWS ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ฐ๊ฒฐ์ ์ํํ ์ ์๊ณ Java SDK v2 ๊ธฐ๋ฐ์ ์ํ ์ฝ๋ ์ค์์ Direct MQTT with X509-based Mutual TLS Method ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํด๋ณด์์ต๋๋ค. ์ํ ์์ ๋ฌธ์์ ๋ค๋ฅด๊ฒ AwsIotMqtt5ClientBuilder ์๋ newMtlsBuilder๋ผ๋ ํจ์๊ฐ ์์ผ๋ฏ๋ก newDirectMqttBuilderWithMtlsFromMemory ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฉฐ PEM ํ์์ ๋ฌธ์์ด์ ์ฝ๊ธฐ ์ํด์ Files.readAllBytes
๋์ ์ JDK 11์์ ์ถ๊ฐ๋ Files.readString
์ ๋์ ํ์ฉํ์ต๋๋ค.
Mqtt5Client client = null;
try (IotClient iotClient = IotClient.builder()
.credentialsProvider(DefaultCredentialsProvider.create())
.region(Region.AP_NORTHEAST_2)
.build()) {
DescribeEndpointResponse endpoint = iotClient.describeEndpoint(builder ->
builder.endpointType("iot:Data-ATS").build());
String dataAtsEndpoint = endpoint.endpointAddress();
String certificatePem = getPem("certificate.pem");
String privateKey = getPem("privateKey.pem");
String caRoot = getPem("AmazonRootCA1.pem");
ConnectPacket.ConnectPacketBuilder connectProperties = new ConnectPacket.ConnectPacketBuilder()
.withClientId("PC");
client = AwsIotMqtt5ClientBuilder
.newDirectMqttBuilderWithMtlsFromMemory(dataAtsEndpoint, certificatePem, privateKey)
.withCertificateAuthority(caRoot)
.withConnectProperties(connectProperties)
.build();
client.start();
Thread.sleep(Duration.ofMinutes(5));
} finally {
if (client != null) {
client.close();
}
}
public static String getPem(String filename) {
try {
return Files.readString(Path.of(ClassLoader.getSystemResource(filename).toURI()), StandardCharsets.UTF_8);
} catch (Exception e) {
return "";
}
}
์ฐ๊ฒฐ ์คํจ์ ๋ํ ์ค๋ฅ ์์ธ์ ๋ํด์ ์์๋ณด๊ธฐ โ
IoT ๋๋ฐ์ด์ค์ MQTT ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ๋ํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์คํจ์ ๋ํ ์ค๋ฅ ์์ธ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ์์ธ ์ผ์ด์ค๋ฅผ ๋ค๋ฃฐ ์ ์์ง๋ง ์ ๊ฐ ๊ฒฝํํ๋ ์ผ์ด์ค๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ์ค๋ฅ ์์ธ์ ๋ฏธ๋ฆฌ ์์๋๋ฉด ์ฝ๊ฒ ์์ธ์ ์ฐพ์๊ฐ ์ ์๋๋ฐ ๋์์ด ๋๊ธฐ๋ ํฉ๋๋ค.
LifecycleEvent: no lifecycle events found! โ
software.amazon.awssdk.crt.CrtRuntimeException: LifecycleEvent: no lifecycle events found! - error code: 38 (aws_last_error: AWS_ERROR_INVALID_STATE(38), An invalid state was encountered.) AWS_ERROR_INVALID_STATE(38)
Mqtt5Client๋ฅผ ์์ฑํ ๋๋ Mqtt5ClientOptions.LifecycleEvents
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์์ ์ฃผ๊ธฐ์ ๋ํ ๋์์ ๋น๋์ ๋ฑ๋กํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ ๊ฐ์ด ๋ผ์ดํ ์ฌ์ดํด์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
CONNACK:Client is not authenticated/authorized to send the message โ
CONNACK:Client is not authenticated/authorized to send the message:30d84af7-ddab-fd2e-7931-2592832a22d5
์ ์ค๋ฅ ๋ฉ์์ง๋ onConnectionFailure ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌ๋๋ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ ์ฌ์ ์
๋๋ค. ์ด ๋ฉ์์ง๋ ํด๋ผ์ด์ธํธ๋ก ์ธ์ฆํ ์ ์๋ค๋ ๊ฒ์ผ๋ก ํด๋ผ์ด์ธํธ ์์ด๋(์ฌ๋ฌผ ์ด๋ฆ)์ ์ฐ๊ฒฐ๋ ์ธ์ฆ์์ ์ฌ๋ฐ๋ฅธ ์ ์ฑ
์ด ์ฐ๊ฒฐ๋์ง ์์์ ๋ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก iot:Connect
์์
์ ๋ํ ์ ์ฑ
์ด ์ฐ๊ฒฐ๋ ์ํ๊ฐ ์๋์ง ์๋ชป๋ ํด๋ผ์ด์ธํธ์ ๋ํ ๊ถํ์ ๊ฐ์ง๋์ง ํ์ธํด๋ณด๋ฉด ๋ฉ๋๋ค. ๋ฉ์์ง ์ฐ๊ฒฐ ๊ถํ์์ ํ์ธํ๋ ์ฌ๋ฌผ ์ด๋ฆ์ ํด๋ผ์ด์ธํธ ์์ด๋๋ก ์ฐ๊ฒฐํ ์ ์๋ ๊ถํ์ ๊ฐ์ง๋๋ก
ํ X.509 ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ์ ์ฑ
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ErrorCode: 5134 โ
onConnectionFailure ์ฝ๋ฐฑ ๊ฒฐ๊ณผ๊ฐ ConnAckPacket ์ด ๋น์ด์๊ณ ์๋ฌ ์ฝ๋๊ฐ 5134
๋ก ์ ๋ฌ๋๋ค๋ฉด ์ฌ๋ฌผ์ ์ฐ๊ฒฐ๋ ์ธ์ฆ์๊ฐ ๋นํ์ฑํ
์ํ์ผ ์ ์์ต๋๋ค. ์ด๋ฏธ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ธ์ฆ์๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ์ธ์ฆ์ ์ ์ฑ
์ ๋ณ๊ฒฝํ๋๋ผ๋ ์ด๋ฏธ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ ํด์ ๋์ง ์์ผ๋ฏ๋ก ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.