AWS Device Farm でモバイルアプリからバックエンドサーバーに接続


![Screen Shot 2015-08-18 at 4.01.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/daaf6795-5fa8-1098-54ea-2918e16bd218.png)


## バックエンドサーバーに認証は必要か？
現時点で、DeviceFarm のインターネット側の IP アドレスを指定したり限定したり出来ません。また、次項に示す通りいくつかのの IP アドレスが共有利用されます。そのため、バックエンドサーバー側で接続元 IP アドレスで厳密に制限をかけることは難しいです。バックエンドサーバー側を一般公開せずに Device Farm からテストしたいような場合は、ID/PASSWORD など何かしらサーバー側で認証を実施する必要があります。

## とはいえ、Device Farm 側の接続元IPを確認してみた

Android および iOS の WebView で任意のサーバーに HTTP アクセスするようなアプリを実装し、Device Farm で数多くのデバイス上で Fuzz テストを実施しました。サーバー側では Apache が動いておりアクセスログを確認できるようにしています。以下がテスト結果です。

```text:access_log_iOS
54.244.50.33 - - [18/Aug/2015:04:52:05 +0000] "GET /?59DC0485-2CC7-44D0-B396-BDA277F0E829 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508"
54.244.50.33 - - [18/Aug/2015:04:52:11 +0000] "GET /?E1C58958-2237-4FC7-9036-69403DF4ABDC HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365"
54.244.50.33 - - [18/Aug/2015:04:52:14 +0000] "GET /?60EB29D4-4D3A-4A81-AA8D-4054576BAFCD HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A405"
54.244.50.32 - - [18/Aug/2015:04:52:20 +0000] "GET /?51CDDD6A-3391-4862-973C-CC8C65FE66C7 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365"
54.244.50.33 - - [18/Aug/2015:04:52:21 +0000] "GET /?552F09A6-A96B-4E58-B869-FD0C374C9BE2 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70"
54.244.50.33 - - [18/Aug/2015:04:52:22 +0000] "GET /?C08ACF96-19EE-48CC-AF86-0638D2B7D0ED HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B435"
54.244.50.32 - - [18/Aug/2015:04:52:25 +0000] "GET /?8CC5E9B2-A635-4DD7-B162-5497FF72707D HTTP/1.1" 200 51 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257"
・・・
```

```text:access_log_Android
54.244.50.32 - - [18/Aug/2015:06:51:03 +0000] "GET /?d10ef01e-13ff-413a-a24b-bc17a35ec2bd HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.4; XT1045 Build/KXB21.14-L1.63) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:03 +0000] "GET /?67069e75-7d83-4693-bd5b-a83e8df06296 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.2; LG-V410 Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:04 +0000] "GET /?81445f8a-3315-4600-ae38-9c959665e0c9 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.4; 831C Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:08 +0000] "GET /?cf57ad6e-ca93-4e6b-a62d-e676a0470649 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910P Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:09 +0000] "GET /?f8078b11-0494-40cf-a5f9-600b853bbc7e HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910T Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36"
54.244.50.32 - - [18/Aug/2015:06:51:10 +0000] "GET /?25c9f94b-e74c-494e-a28f-2a51427713f1 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 5.0.2; Nexus 7 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:11 +0000] "GET /?0f50a65e-0c40-4c95-a0af-96e685aaea62 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; Android 4.4.2; SCH-I535 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36"
54.244.50.33 - - [18/Aug/2015:06:51:11 +0000] "GET /?748ccfb4-ec34-4f1a-add9-a3895de42de0 HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; SAMSUNG-SGH-I337 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
・・・
```


ということで現時点では、 54.244.50.32 もしくは 54.244.50.33 からインターネットにぬけていることが分かりました。

## AWS 公表の IP Range から割り当て可能性がある IP を調べてみる

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

```shell-session-session:jq
curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes' | jq 'map(select(.region == "us-west-2" ))'| jq 'map(select(.service == "AMAZON" ))' | jq '.[] | .ip_prefix’
```

```shell-session:IPs
"50.112.0.0/16"
"52.10.0.0/15"
"52.12.0.0/15"
"52.24.0.0/14"
"52.88.0.0/15"
"52.95.247.0/24"
"52.95.255.112/28"
"54.68.0.0/14"
"54.148.0.0/15"
"54.184.0.0/13"
"54.200.0.0/15"
"54.202.0.0/15"
"54.212.0.0/15"
"54.214.0.0/16"
"54.218.0.0/16"
"54.231.160.0/19"
"54.239.2.0/23"
"54.239.48.0/22"
"54.240.230.0/23"
"54.240.248.0/21"
"54.244.0.0/16"
"54.245.0.0/16"
"176.32.125.0/25"
"205.251.232.0/22"
```

ひろい・・・
最近、海とか行ってねぇなぁ。
う〜み〜は〜、ひろい〜な〜、お〜きぃ〜な〜。

実際は、レンジをもっと**小さな範囲で絞り込むことは可能**です。
これにより課題を解決できるようなケースであれば、お近くの SA にお問い合わせください。

## Device Farm の内部構造をなんとなく予想できる
IP アドレスが共有されてインターネットにぬけていくのがわかりましたが、これでなんとなくDevice Farm 側のインターネットにぬけるアーキテクチャ(何かしらプロキシ的なものがある)は予想できます。

## インターネット側のキャッシュに注意
ちなみに、テストをしていて気づいたのですが、Device Farm のインターネット側にキャッシュが効くようで、バックエンドサーバーまでアクセスが到達できない場合があるようです。今回は UUID を生成して URL に連結して回避しました。

```swift:ViewController.swift
var targetURL = "http://52.68.xxx.xxx/?"
var uuid = NSUUID().UUIDString
var url = NSURL(string: targetURL + uuid)
var request = NSURLRequest(URL: url!)
self.webView?.loadRequest(request)
```

```java:MainActivity.java
String targetURL = "http://52.68.xxx.xxx/?";
String uuid = UUID.randomUUID().toString();
webView.loadUrl(targetURL + uuid);
```

## 免責
個人の意見です。