내가 만든 Lambda 함수에서는 AWS RDS 에 접근도 필요했고, 외부 인터넷으로의 접근도 필요했다.

RDS SG(Security Group) 설정상 Lambda 를 VPC 내에 뒀는데, 이러면 Lambda 에서 외부 인터넷으로 접근이 안된다..!


현재 내가 찾은 해결법들은 꼼수 포함 4가지.

1. RDS의 SG설정을 전체 허용, 혹은 Amazon EC2 IP 목록 허용한다.

SG를 전체허용한다면 Lambda 를 VPC 내에 두는 이유가 사라진다.


후자는 Lambda 가 있는 리전의 Amazon EC2 IP 들을 RDS 의 SG 에 때려박아두는 방법.


Amazon 이 사용하는 IP 주소 목록은

https://ip-ranges.amazonaws.com/ip-ranges.json

이 주소에서 JSON 형태로 확인할 수 있다.


관련 설명은 https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws-ip-ranges.html 여기 참고.



대충 위의 접어둔 파이썬 코드를 이용해서,

ap-northeast-2 region 의 EC2 service ip prefix 만 가져온 다음에, 이걸 Security Group 에 넣으면 해결.


Source 에 쉼표로 구분된 값을 넣고 저장하면 알아서 분리된다.


2. AWS에서 제공하는 Managed NAT Gateway를 사용한다.

 VPC 에 Managed NAT Gateway 를 생성하여, VPC 내의 Private subnet 이 외부 인터넷 접속이 가능해주게끔 구성하는 방법

다만 이 NAT Gateway 비용이 월 $40가 넘는다...


3. 외부 인터넷으로 접근하는 함수, VPC 내에서 DB에 접근하는 함수 두개를 만들어 함께 사용한다.

Lambda 비용이 두배로 들겠지만, 어차피 1백만회를 초과할 것 같지도 않고, 초과해도 NAT Gateway 비용보다는 쌀 것 같달까...


다만, VPC 설정이 된 람다함수는 다른 람다함수를 호출할 수 없다. 람다 호출 자체가 외부 인터넷을 사용하는 셈이라..

VPC 밖의 함수를 A(외부 인터넷 연결 가능), VPC 안의 함수를 B 라고 한다면,

항상 A 호출 -> A에서 B를 호출하여 DB작업 -> A에서 결과를 받아서 후처리 -> 반환

의 형태를 취해야한다. 경우에 따라 상관없을 수도 있지만 비효율적으로 될 수도 있는 방법.


4번의 방법을 몰랐기 때문에 난 이렇게 구성해뒀다.


4. ec2 로 NAT instance 를 직접 구축한다.

AWS 에 문서가 있다. -> VPC NAT Instances


후에 시간있을때 적용해볼 예정.

위 글에선 미리 만들어진 AMI를 사용하는데, 나는 기존 Ubuntu Instance 를 어떻게 활용해볼 예정이다.


방에 에어컨을 달았는데, 마찬가지로 HomeKit 으로 제어해보고 싶었다.

리모컨이 있으니 전등에 비해 꼭 필요한건 아니였지만...

시리로 켜고 끈다거나,, 온도에 따라 자동 제어 같은걸 해보고 싶어서...


가장 먼저 에어컨 리모컨 신호를 받아서, 아두이노로 다시 보내서 테스트해보는걸 먼저 해보았다.



이번에 방에 설치한 에어컨.

LG WHISEN SUC066BC 모델...

이모가 쓰시던걸 받아왔다.



IR 은 예전에 적외선 송수신 킷을 구매했던걸 활용하였다.


구매처는 아트로봇, 링크

무려 13년도에 샀던건데, 구매내역에 잘 보관되어 있었다..


어떻게 연결하는지 등은 Hook-up Guide 글을 보자.

연결 후에는 아두이노에서 IRremote 라이브러리를 내려받고 사용하면 된다.


라이브러리를 받은 후에

libraries/IRremote/examples/ 폴더로 가면

IRsendRawDemo, IRrecvDumpV2 예제가 있으니, 이 스케치로 원래 리모컨의 신호를 읽고, 날려보면 된다.


예시 폴더에 LGACSendDemo.. 가 있는 것은 이 글을 보면서 발견했는데,,

https://github.com/chaeplin/lgwhisen 이런 오픈소스도 있지만 결과적으로 나는 제대로 작동하지 않아서, 다시 코드를 짰다.



여튼 돌아와서, IRrecvDumpV2 스케치를 업로드한 후에 리모컨으로 눌러보면



이런식으로 신호가 나오게된다.


rawData 를 복사해서 IRSendRawDemo 의 예시처럼,

irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), khz)

이렇게 보내주면 그대로 복사하는거라고 하는데....


실제로 해보면 안된다. ㅡㅡ;


또한 에어컨 리모컨은 특성상, 각 신호가 온도, 바람세기 등의 정보를 가지고 있는데 저걸 어떻게 분석해야하나.. 난감했는데,

위의 LG 에어컨 코드들이 제대로 작동은 안할지언정 기본 베이스가 같아서 도움이 되었다.


위 코드와 IRremote 라이브러리의 ir_LG.cpp 등의 코드를 보면,

업다운 신호가 한 세트로, +500, -500 이면 0, +500, -1500 이면 1 이 되어서 28 bit 의 신호를 만들게 된다.

위 사진의 경우 1000 1000 1100 0000 0000 0101 0001 이 되겠지.


이제 IRrecvDumpV2 스케치에서 loop 함수를 이렇게(접어둠) 바꿔두고 리모컨을 눌러보며 신호를 분석해보면 된다.




git 에 https://github.com/chaeplin/lgwhisen/blob/master/decoding.md 이것도 참고 사항이 되긴 하지만...

리모컨 몇번 눌러보면 금방 파악이 되긴 한다.



나의 버전으로 다시 정리를 해보자면 28bit 가

1000 1000 (1) (2) (3) (4) CRC

이렇게 생겨먹었고, CRC 는 ( (1)+(2)+(3)+(4) ) & 0xFF


모드별로 보면

                    (2)

    냉방:          0  =>    0000 x000 xxxx xxxx

    제습:           1  =>     0000 x001 1001 xxxx

    송풍:          2  =>     0000 x010 0011 xxxx

    인공지능:    3  =>     0000 x011 0010 0101

                                               ㄴ 0: 전원을 켤때, 1: 이미 켠 후 조작시


대충 이렇게 생겼다.


(3) 은 주로 온도. 온도에서 15를 뺀 값

 

 (4) 는 바람 세기.

    low:      0

    mid:      2

    hight:    4

    auto:     5

이렇게였는데, 이건 위의 예제들의 분석과 동일하다.



여튼 이제 원하는 28bit 를 만들 수 있으니 이 신호를 보내면 된다.




아두이노를 두개 준비해서 보낸 신호를 확인해봐도 좋다.



먼저 적외선 LED 를 아두이노에 연결는데, 타이머를 사용해서 핀이 정해져있다.

Uno, Nano 등의 보드의 경우 PIN 3 을 사용하면 된다.


연결 후 스케치를 업로드 해보면 sendRaw 함수로는 여전히 작동을 안하는데..

28bit 를 long 으로 만들어서 irsend.sendLG 함수를 이용하면 된다.


다만 내가 쓴 위 적외선 송수신 킷의 경우, 신호가 많이 약해서 상당히 가까이,

약 30cm 거리에서 작동해서 처음에 안되는 줄 알았다..


앞으로 코드가 많이 수정되겠지만, 이 단계까지의 나의 코드는 아래와 같다.



망할 MS는 unicode 를 기본지원하지는 못할망정 호환지원도 제대로 못한다.

 

utf-8 csv의 경우에, Excel 로 바로 열면 한글이 모두 깨져버리는데,

데이터 불러오기 등의 번거로운 방법을 통해 불러오더라도 깨지는 X같은 경우가 발생한다.

 

나도 웬만하면 cp949로 인코딩을 굳이 해줄텐데,, 웹에서 javascript 로 데이터를 생성하고 바로 내려받는지라,

어떻게 방법이 없이 MS에 대한 저주만 한가득 하고 있었는데....

 

-------------------------------------------

 

UTF-8 BOM 을 통해 (반틈만) 해결하였다.

 

방법은, 파일의 가장 앞에 \xef\xbb\xbf 혹은 \ufeff 을 넣어주면 된다.

이제 Excel 에서 바로 열어도 한글이 깨지지 않는다.

 

나의 경우엔

'data:application/csv;charset=utf-8,'+encodeURIComponent(csv)

'data:application/csv;charset=utf-8,\ufeff'+encodeURIComponent(csv)

이렇게 바꿔주었다.

 

다만, Excel 이 아닌 다른 프로그램으로 열거나 직접 csv파일을 읽어와서 작동시킬때 문제가 생길 수도 있는데....

이건 MS 를 욕하자.

 

-------------------------------------------

Python의 경우 파일을 쓸 때 인코딩을 utf-8-sig 로 지정하면 된다

open(filepath, 'w', encoding='utf-8-sig')

-------------------------------------------

 

MS 는 IE(+Edge)와 CP949(euc-kr)를 하루빨리 없애버렸으면 좋겠다.

 

 

참고

 

UTF-8 인코딩에서의 BOM(Byte Order Mark) 문제 :: wystan's tales

 

https://stackoverflow.com/questions/17879198/adding-utf-8-bom-to-string-blob

+ Recent posts