ã«ã¼ã¿ã¼ããã¯ã©ã¦ããæã
ããã«ãé£ãã£ã½ãã¿ã¤ãã«ã§ç³ã訳ãªãã¨ããè¨ãããããªãã®ã§ãããYAMAHA RTXã·ãªã¼ãºããAWSã®APIãå©ãå®é¨ããã¦ã¿ãã®ã§ããã®ã¡ã¢ã§ãã
YAMAHAã«ã¼ã¿ã¼ã®Luaã¹ã¯ãªããã£ã³ã°æ©è½
æè¿ã®YAMAHAã®ãã¡ã¼ã ã«ã¯Luaã¹ã¯ãªããã£ã³ã°æ©è½ãä»ãã¦ãã¦ãå®æçã«configããã¦ã³ãã¼ããã¦é©ç¨ãããããæé帯ã«å¿ãã¦ã«ã¼ãã£ã³ã°ãå¤ãããã¨ãã£ãæè»ãªéç¨ãã§ãã¾ãã詳ããã¯本家のサイトに解説ããã¦ãã¾ãããã®æ©è½ã使ã£ã¦AWSã®APIãå©ããããããããªãã¨ãã§ããããããªããã¨æã£ã¦ãPOCçã«å®é¨ãã¦ã¿ã¾ããã
YAMAHAãã¡ã¼ã ãæºæ ãã¦ããã®ã¯Lua 5.1.4ã¨ãããã¨ã«ãªã£ã¦ãã¾ããããã«ä»æ§ã§ã¯ãªããµãã»ããã®ã¿ãå®è£ ããã¦ããã®ã§ããã工夫ãå¿ è¦ã§ããããã¨ããããDescribeSecurityGroupsã§ã»ãã¥ãªãã£ã»ã°ã«ã¼ãã®ãªã¹ããåå¾ããã¹ã¯ãªãããæ¸ãã¦ã¿ã¾ããã
AWS REST APIã®ã·ã°ããã£è¨ç®
HMAC-SHA1ã®è¨ç®ã¨BASE64ã¨ã³ã³ã¼ãã£ã³ã°ãå¿
è¦ã«ãªãã®ã§ã以ä¸ã®2ã«æããå
éã®ã¹ã¯ãªãããæ¢ãã¦ãã¾ããã
SHA-1 and HMAC-SHA1 Routines in Pure Lua (by Jeffrey Friedl. Public Domain)
Base Sixty Four (by Alex Kloss. LGPL2)
AWSã®ããã¥ã¡ã³ãï¼Making Query Requestsï¼ã«å¾ã£ã¦ã¯ã¨ãªãçµã¿ç«ã¦ã¦ãã·ã°ããã£ãè¨ç®ãã¾ãã
access_key = "YOUR_ACCESS_KEY_ID" secret_key = "YOUR_SECRET_ACCESS_KEY" api = "DescribeSecurityGroups" api_version = "2011-07-15" host = "ec2.amazonaws.com" http_method = "GET" --ISO8601ã§ã¿ã¤ã ã¹ã¿ã³ããåå¾ time_stamp_raw = os.date("!%Y-%m-%dT%H:%M:%S.000Z") time_stamp = string.gsub(time_stamp_raw, ":", "%%3A") --ã¢ã¯ã»ã¹ãã¼ä»¥å¤ã®å¼æ°ãæé ã«ä¸¦ã¹ãã¯ã¨ãªãçµã¿ç«ã¦ã s2s = http_method .. "\n" .. host .. "\n/\nAWSAccessKeyId=" .. access_key .. "&Action=" .. api .. "&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=" .. time_stamp .. "&Version=" .. api_version --HMAC-SHA1ã®è¨ç®çµæãBASE64ã¨ã³ã³ã¼ãã£ã³ã°ãã¦ã·ã°ããã£ãçæ signature = base64(hex_to_binary(hmac_sha1(secret_key, s2s)))
ãªãããªãªã¸ãã«ã®HMAC-SHA1ã®è¨ç®ãã¸ãã¯ãYAMAHAçLuaã®å¶ç´ã«åããã¦ä¿®æ£ããå¿ è¦ãããã¾ãããå¼ã£ããã£ãå¶ç´ã¯ã
- æ°å¤ãæ´æ°ã®ã¿ã§æµ®åå°æ°ç¹æ°ãæ±ããªã
- Mathã©ã¤ãã©ãªã®modf関数ãå®è£ ããã¦ããªã
ã®2ç¹ã§ããã
ä»åã¯ã¯ã¨ãªã®æåæ°ãä¸å®ã§ããã°è¨ç®çµæãå¤ãããªãé¨åã ã£ãã®ã§ãè¨ç®ãªã½ã¼ã¹ã®ç¯ç´ã®æå³ãå ¼ãã¦ãçµæããã¼ãã³ã¼ãã£ã³ã°ãããã¨ã§åé¿ãã¾ããããã®ä»ã®APIãåãã¹ã¯ãªããã§æ±ãããã«ããå ´åã¯ãAPIã³ã¼ã«ã¨è¨ç®çµæãtableã§é¢é£ã¥ãããããªå®è£ ã«ãªããã¨æããã¾ããï¼Luaã«ãããtableã¯ãRubyã®Hashã®ãããªãã®ã§ããï¼
--æµ®åå°æ°ç¹æ°ã¨math.modfã¯YAMAHA Luaã§å®è£ ããã¦ããªã --local B1, R1 = math.modf(msg_len_in_bits / 0x01000000) --local B2, R2 = math.modf( 0x01000000 * R1 / 0x00010000) --local B3, R3 = math.modf( 0x00010000 * R2 / 0x00000100) --local B4 = 0x00000100 * R3 --EC2 DescribeSecurityGroupsã³ã¼ã«ã®ããã®dirty hack if msg_len_in_bits == 2040 then B1, B2, B3, B4 = 0, 0, 7, 248 elseif msg_len_in_bits == 672 then B1, B2, B3, B4 = 0, 0, 2, 160 end
ã¡ãªã¿ã«ãæµ®åå°æ°ç¹æ°ãã使ããã°ãmath.modfãå®è£ ããã®ã¯ç°¡åã§ã以ä¸ã®ããã«ãªãã¯ãã§ãã
--math.modf function modf_(n) if n > 0 then f = n % 1 else f = n % -1 end i = n - f return i, f end
HTTPãªã¯ã¨ã¹ãã®çºè¡ã¨çµæã®åå¾
YAMAHAã«ã¼ã¿ã¼ã®Luaã§ã¯ãconfigã®æä½ãªã©ãæ¨æºLua以å¤ã®ã©ã¤ãã©ãªãå®è£ ããã¦ãã¾ãããã®ãã¡ã®ä¸ã¤ã§ããrt.httprequestã使ã£ã¦EC2ã¨ã³ããã¤ã³ãã«APIã³ã¼ã«ãæãã¾ããrt.httprequestã§ã¯çµæã®ããã£ããã¡ã¤ã«ã«æ¸ãè¾¼ããã¨ãã§ããã®ã§ã以ä¸ã®ä¾ã§ã¯ã«ã¼ã¿ã¼ã®å èµã¡ã¢ãªã«æ¸ãè¾¼ãã§ãã¾ãããã®ã»ããæ©ç¨®ã«ãã£ã¦å·®ãããã¾ãããã«ã¼ã¿ã¼ã«æ¿å ¥ããmicroSDãUSBæ¥ç¶ãããã¹ãã¬ã¼ã¸ã«ãã¡ã¤ã«ãæ¸ãè¾¼ããã¨ãã§ãã¾ãã
--ã·ã°ããã£ãã¤ãã£ã¦ã¯ã¨ãªãçµã¿ç«ã¦ã query = "Action=" .. api .. "&AWSAccessKeyId=" .. access_key .. "&Version=" .. api_version .. "&Timestamp=" .. time_stamp_raw .. "&Signature=" .. signature .. "&SignatureVersion=2&SignatureMethod=HmacSHA1" --rt.httprequestã§ã¯SSLã¯æªå®è£ req_url = "http://" .. host .. "/?" .. query --ãªã¯ã¨ã¹ãã»ãã©ã¼ã¡ã¼ã¿ãæ ¼ç´ãããã¼ãã«ãä½æãã¦GETãçºè¡ --rsp_t.codeã§HTTPã¹ãã¼ã¿ã¹ã³ã¼ããrsp_t.errã§ã¨ã©ã¼ã¡ãã»ã¼ã¸ã確èªå¯è½ file_path = "/sg_out.txt" req_t = {url=req_url, method="GET", save_file=file_path} rsp_t = rt.httprequest(req_t)
å®è¡çµæã®ç¢ºèª
- tftpã§ã¹ã¯ãªãããã«ã¼ã¿ã¼ã«ã¢ãããã¼ã
- ã«ã¼ã¿ã¼ã§ã¹ã¯ãªãããå®è¡
- çµæã®ãã¡ã¤ã«ããã¼ã«ã«ã«ãã¦ã³ãã¼ããã¦ç¢ºèª
ã¨ããæé ã§åä½ç¢ºèªãè¡ãã¾ãã
Macã§ãã以ä¸ã®ããã«tftpã§ãã¡ã¤ã«ãã¢ãããã¼ããã¾ãããç´å¾ã«getãè¡ããããå人çã«ã¯ã¤ã³ã¿ã©ã¯ãã£ãã»ã¢ã¼ãï¼ï¼ï¼ã使ããããã¨æãã¾ãããROUTER_IP_ADDRESSã¨ROUTER_ADMIN_PASSORDã®é¨åã¯ãããããé©åãªå¤ã«ç½®ãæãã¦ãã ããã
$ tftp tftp> connect ROUTER_IP_ADDRESS tftp> put desc_sg.lua /desc_sg.lua/ROUTER_ADMIN_PASSWORD Sent 34235 bytes in 0.6 seconds
ã«ã¼ã¿ã¼ã§Luaã¹ã¯ãªãããå®è¡ãã¾ããadministratorã§å®è¡ãã¦ããç¹ã«æ³¨æã
# lua desc_sg.lua
çµæããã¼ã«ã«PCã«ãã¦ã³ãã¼ããã¦å 容ã確èªãã¾ãã
$ tftp tftp> connect ROUTER_IP_ADDRESS tftp> get /sg_out.txt/ROUTER_ADMIN_PASSWORD sg_out.txt Received 2130 bytes in 0.1 seconds tftp> quit $ cat sg_out.txt 846 <?xml version="1.0" encoding="UTF-8"?> <DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2011-07-15/"> <requestId>########-####-####-####-############</requestId> <securityGroupInfo> <item> <ownerId> ï¼ä»¥ä¸çç¥ï¼
å¶ç´ã¨ãããªã©ãã
ç¹°ãè¿ãã«ãªãå 容ãå¤ãã§ãããYAMAHA Luaä¸ã§AWS APIãå©ãä¸ã§å¶ç´ã¨ãªããããªç¹ãåæãã¾ããMacãLinuxç¨ã®ãã®ã¨ã¯è¨èªä»æ§ãã©ã¤ãã©ãªã®å®è£ ç¶æ³ã«å·®ãããã®ã§ããã¾ãã«å®æ©ã§ãã¹ãããã®ãç¡é£ã ã¨æãã¾ãããèªåã¯Ruby (Sinatra) ã§ã¹ã¿ããæ¸ãã¦ããããã°ãè¡ãã¾ããã
- æµ®åå°æ°ç¹ã使ããªã
- ä¸é¨é¢æ°ãå®è£ ããã¦ããªã
- URLæ«å°¾ã«'/'ï¼ã¹ã©ãã·ã¥ï¼ããªãã¨invalid URLã¨ãªã£ã¦ãªã¯ã¨ã¹ããé£ã°ãªã
- URLã255æåã¾ã§ã«å¶éããã¦ããããã®ãããGETã§å©ããAPIã³ã¼ã«ã¯å¶éãå³ããã
- rt.httprequestã¯åæã«URLã¨ã³ã³ã¼ãã£ã³ã°ãã¦ãããã®ã§ã"="ã"%3D"ã«ç½®ãæãã¦ããã¨ãããã«"%"ãã¨ã¹ã±ã¼ããã¦"%253D"ã«å¤æããã¦ãã¾ãã®ã§ã·ã°ããã£ãä¸è´ããªããã¨ã«ãªãã
- ããã£ã®å¤§ããã«ãå¶éãããã
- SSLã使ããªãã®ã§ãAccess Key IDãã¯ã¨ãªã®ãã©ã¼ã¡ã¼ã¿ã¼ãå¹³æã§é£ãã§ãã¾ãã
ã¾ã¨ã
YAMAHAã«ã¼ã¿ã¼ä¸ã®Luaã¹ã¯ãªããã£ã³ã°æ©è½ã使ã£ã¦EC2 APIã®1ã¤ã§ããDescribeSecurityGroupãçºè¡ãããã¨ãã§ãã¾ãããè²ã ã¨å¶ç´ã¯ããã¾ãããã¹ã¯ãªããããVPCã®ä½æã¨configã¾ã§ã§ããããã¦ãã¾ãã¨ããããããããããªãã¨æãã¾ããã
ãªããCredentials ï¼Access Key IDãªã©ï¼ ã®æ±ãã«ã¯æ³¨æããå¿ è¦ããããã¨æããã¾ããrt.httprequestã®å¶éã«ãã£ã¦SSLã使ããªããã¨ãããã¾ãããå®éã«ã¯IAMã使ã£ã¦æ¨©éã«å¶ç´ãã¤ããéµãå©ç¨ããã®ããããã¨æããã¾ãã
ï¼è¨ãããããªã§ãããç§ã®å¤ãå ãªã©ã¯æ¬è¨äºã®å 容ã«ä¸åé¢ç¥ãã¦ãã¾ãããï¼
gistã«è²¼ã£ã¦ããã¾ãã â https://gist.github.com/1174442