SORACOM Arcを使ってAWS LambdaからSORACOMサービスを利用する

# はじめに

WiFiや有線インターネットからでもSORACOMサービスが利用できるSORACOM Arc、早速使ってみたという記事が続々と出てきていますね。見ていると、実にいろんな環境で動かしています。

- ラズパイ: [Raspberry PiでSORACOM Arcを利用してSORACOM Napterを使ってみた話](https://qiita.com/nc30mtd/items/9f9e62b385bff9d2909a)
- ルーター: [すべてが S になる (SORACOM Arc をルーターで使う)](https://zenn.dev/j3tm0t0/articles/db9c4ddcb01167)
- macOS: [MacPCにWireGuardを入れて、SORACOM Arcを試してみる。](https://qiita.com/keni_w/items/3c1bd01c846c430a8ae1)
- Windows: [WindowsとcliでSORACOM Arcを試してみた](https://zenn.dev/showm001/articles/2021-06-23-01)
- iOS + Android: [SORACOM Arcをスマートフォンで試してみた](https://zenn.dev/showm001/articles/2021-06-24-01)
- Docker: [SORACOM Arcで自宅ネットワークをSORACOMプラットフォームに接続する](https://kizawa.info/soracom-arc)
- EC2: [SORACOM Arc を使って EC2 に セキュリティグループを超えて SORACOM Napter でリモートアクセスしてみた](https://dev.classmethod.jp/articles/soracom-arc-soracom-napter-for-ec2/)
- CodeBuild: [SORACOM Arcはデバイスだけじゃなくてクラウドでも動かせるんだよ！という話](https://qiita.com/1stship/items/8afda01d8dd832bd731c)

(同じ環境と思ったものは最初に見つけたものを紹介しています)

この環境からSORACOM動かせたら面白そう、便利そう、と思われているということですね。
ラズパイやルーター、スマートフォンなどの物理デバイスだけでなく、EC2のような仮想環境、あるいはDockerやCodeBuildのようなコンテナ環境なんかでも動作できてます。WireGuardというVPN技術がネットワークに要求することが少なく、NAT以下のデバイスでも使えるため、比較的簡単に構築できているのもいいですね。

# AWS Lambdaでは使えないの？

さて、CodeBuildの記事は私が書いたのですが、本当はAWS Lambdaでやるつもりでした。やっぱりクラウドのいいところである、実行環境を構築・運用せずに処理を実行できるFaaSが使いたいわけです。ただ、実行環境を用意しなくてもいいということは、実行環境が自由にできないということでもあります。VPNを作るためにはネットワークを作成するLinuxの権限が必要なのですがLambdaにはその権限がなく、WireGuardのVPNを作ることができませんでした。そのためLambdaでの実行はいったん諦めました。
(アプリケーションでWireGuardのVPNを実装すればいける可能性はあるけど現実的ではない)

![lambda_arc_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2f914abc-a384-9586-b362-61126c925267.png)

その後上のいろいろな記事、特に[SORACOM Arcで自宅ネットワークをSORACOMプラットフォームに接続する](https://kizawa.info/soracom-arc)を読みまして、「SORACOMサービスにルーティングするルーターの下にLambdaの実行環境を入れる」というアイデアを思いつきました。これならLambdaからは特にVPNを作成する必要なく、普通にSORACOMサービスにアクセスできるようになるはずです。

![lambda_arc_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/7240b0fc-75aa-262b-981e-cf1954a3d3a9.png)

この構成を取るためには、SORACOM ArcとのVPN接続を作成し、LambdaからのアクセスをSORACOMプラットフォームのIPアドレスレンジ(100.127.0.0/16)にルーティングするEC2インスタンスが必要です。これはNATインスタンスをちょっと改造すれば良さそうです。それではやってみましょう。

# 構築

以下の手順で構築します。

- ネットワーク設定(VPC、インターネットゲートウェイ、サブネット、セキュリティグループ、EIP、ネットワークインタフェース、ルートテーブル)
- NATインスタンスの立ち上げ
- NATインスタンスにsoratunインストール、起動
- NATインスタンスのルーターとしての設定(パケット転送許可、NAPT)
- Lambda関数の作成・テスト

## ネットワーク設定

パブリックなネットワークを手早く作るため、VPCウィザードを使います。

VPCのコンソールのVPCダッシュボード画面にてVPCウィザードを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2ef16d70-7b62-93e9-6278-25e7fceab642.png)

1個のパブリックサブネットを持つVPC(プライベートサブネットを持つVPCを作るとNATゲートウェイが作成されてしまうため)
![スクリーンショット 2021-06-27 21.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/e90531eb-abec-a003-ac90-23bde25038f1.png)

VPCの設定
![スクリーンショット 2021-06-27 21.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/aa04397c-5d8e-6d30-05c7-0d3c47d82312.png)

次にプライベートサブネット(Lambdaを動作させるサブネット)とそのルート設定を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/18ee067e-57e8-2c21-9b96-d29a80e70232.png)

プライベートサブネットの設定
![スクリーンショット 2021-06-27 21.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/9eb1b3fb-0098-7deb-24f7-439c7dafb180.png)

セキュリティグループを作成します。簡単な設定とするため、プライベートサブネットは外向きのみ許可、パブリックサブネットは外向きおよびプライベートサブネットからの通信を全て許可、とします。本番では実使用する通信のみ許可するのが望ましいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/c4d2b0cd-4741-bbf7-cf2b-d32215b49143.png)

プライベートサブネット用
![スクリーンショット 2021-06-27 22.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4a1962dd-e8fa-3722-89f7-ad67f1b926d2.png)

パブリックサブネット用
![スクリーンショット 2021-06-27 22.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4588fc72-e52c-95a4-ff9a-699a17f3f518.png)

NATインスタンスにつけるパブリックIP(EIP)を作成します。
![スクリーンショット 2021-06-27 22.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/91fe8058-b2ba-32e7-4f08-b4a50050c106.png)

![スクリーンショット 2021-06-27 22.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/884dd0d8-e14c-8023-e006-e4a3215685ac.png)

次にネットワークインターフェースを作ります。NATインスタンスへのルートはNATインスタンスのインスタンスIDを指定することもできるのですが、ネットワークインタフェースにしておくといったんNATインスタンスを落としても再利用できるので便利です。これはVPCではなく、EC2のコンソールにて作成します。
![スクリーンショット 2021-06-27 21.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/678475aa-892a-e6b9-f565-34f900eb50fa.png)

ネットワークインタフェースの設定
![スクリーンショット 2021-06-27 22.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/b2d1d1d2-e8ad-4b55-037b-e2620ac0990f.png)

EIPを関連づけます
![スクリーンショット 2021-06-27 22.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/25af20e4-3f5b-89f8-38b6-aa3b347655d5.png)

![スクリーンショット 2021-06-27 22.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/3af4af1a-f650-330c-de76-ce087e20b32a.png)

送信元/送信先チェックを無効にします。EC2インスタンスをルーター、つまり自分宛ではない通信を取り扱うインスタンスとする場合に必要な設定です。
![スクリーンショット 2021-06-27 22.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/dd54821d-3a1d-0b16-855e-1f7c454b728a.png)

![スクリーンショット 2021-06-27 22.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/8ef3c654-008e-f148-3457-72bc3eb68052.png)

次にプライベートサブネット用のルートテーブルを作ります。(パブリックサブネット用はVPCウィザードにて作成されています)
![スクリーンショット 2021-06-27 22.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/206fc235-bea6-0038-ac1e-9291a816a0e3.png)

ルートテーブルの設定
![スクリーンショット 2021-06-27 22.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/15a73192-8396-eac2-3e76-f582c91adf6b.png)

ルートを編集
![スクリーンショット 2021-06-27 22.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/e9e5dfd5-5b5b-6b06-2441-e0ec0aa9c3dd.png)

![スクリーンショット 2021-06-27 22.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/828a55e3-2926-5b12-80c3-34a6c47e3a49.png)

ルートテーブルとサブネットの関連付け
![スクリーンショット 2021-06-27 22.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/c368981b-26ff-889a-4dda-d51c49809048.png)

![スクリーンショット 2021-06-27 22.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/83682f57-aab0-59ec-acf2-8e3ec474efec.png)

これでネットワーク設定は終わりです。そこそこ面倒なので、CloudFormationなどのIaC(Infrastructure as Code)サービスで作成できるようにしておくと次回以降楽ができます。

## NATインスタンスの立ち上げ

NATインスタンスを立ち上げます。
![スクリーンショット 2021-06-27 22.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/dafea951-06e9-4a45-fc42-f746f4be7839.png)

AMIはとりあえずAmazon Linux2でいいでしょう。
![スクリーンショット 2021-06-27 22.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/ed4140ac-4acf-87d4-bd10-61ad4992ea0b.png)

インスタンスタイプはとりあえず最小のt3.nanoとします。NATとして動かす分には十分です。
![スクリーンショット 2021-06-27 22.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/c08eac7a-5079-5e56-bd53-f23e22d76622.png)

各種設定をします。今回はSystems ManagerのSession Managerという機能を使ってEC2を操作するため、IAM RoleにはAmazonSSMManagedInstanceCoreをポリシーに持つロールを選択します。SSHでログインする場合は、セキュリティグループにて22番ポートを許可する、キーペアを準備して進みましょう。
![スクリーンショット 2021-06-27 22.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4da3023a-10cd-4e78-20cf-9410bb2d97d8.png)

ストレージは特に変えるところはありませんが、今回はストレージが必要ないため、ボリュームタイプをgp3とすると8GBでのIOPSが上がるのでおすすめです。価格は最低性能(といっても3000IOPS。gp2だと最低100IOPSなので30倍)で使う分には安くなります。(詳しくは[公式の料金説明](https://aws.amazon.com/jp/ebs/pricing/)をご覧ください)
![スクリーンショット 2021-06-27 22.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/ec2db16c-a566-6991-617a-99c8b598eea1.png)

タグは特につける必要がありません
![スクリーンショット 2021-06-27 23.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/ba9d7683-65f1-e0ec-ed77-f3c9395af51b.png)

セキュリティグループはNATインスタンス用に作成したものを選択します
![スクリーンショット 2021-06-27 22.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/5f920854-1f74-5e70-f3dc-ca3e2b1db099.png)

Session Managerでアクセスするため、キーペアなしで作成します
![スクリーンショット 2021-06-27 23.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/18d52520-374f-b33e-8e80-ef436d984aa2.png)

これでNATインスタンスの立ち上げは終わりです。ここもできればIaCのテンプレートに入れたいですね。

## NATインスタンスにsoratunインストール、起動

NATインスタンスにアクセスするにはSession Managerを使います。EC2のコンソールに統合されたので、そこから入るのがわかりやすいでしょう。
![スクリーンショット 2021-06-27 23.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/b3d94468-f052-5161-f841-fc2374abe988.png)

正しく設定するとセッションマネージャーの接続ボタンが押せます。押せない場合は、何らかの設定ミスがあります。特にEIPをつけたか、IAM Roleは正しいか、を見直しましょう。
![スクリーンショット 2021-06-27 23.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/5026a37d-5dd9-f7b8-30cc-c5588009824c.png)

これでブラウザからEC2のシェルにログインできます。最初はssm-userという特別なユーザーになっていますが、ここからの作業は権限がいるため、sudoを使ってrootとして実行する必要があります。
![スクリーンショット 2021-06-27 23.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2ec4609b-c69c-7f01-fc2b-5fabd5b9eaf1.png)

[公式のインストールドキュメント](https://users.soracom.io/ja-jp/docs/arc/install-soratun/)に従ってsoratunをインストールします。
なお、2021/6/27現在において正式にサポートされているのは以下のプラットフォームです。([サポート対象プラットフォームより](https://users.soracom.io/ja-jp/docs/arc/soratun-overview/))

```
Linux amd64
  Ubuntu 20.04.2 LTS
Linux arm (Raspberry Pi 32-bit)
  Raspberry Pi OS 2021-05-07
  Ubuntu 20.04.2 LTS
```

Amazon Linux2はサポートされていませんので自己責任です。気になる方はUbuntuを使いましょう。

```
wget https://github.com/soracom/soratun/releases/download/v1.0.0/soratun_1.0.0_linux_amd64.tar.gz
tar xvf soratun_1.0.0_linux_amd64.tar.gz
cd soratun_1.0.0_linux_amd64
cp soratun /usr/local/bin
```

これでsoratunコマンドが使えるようになりました。
ブートストラップを実行して、必要な設定ファイルを作成しましょう。
EC2ではSIMを使った認証ができませんので、SAMユーザーを使ったブートストラップを使います。
[公式ドキュメント](https://users.soracom.io/ja-jp/docs/arc/bootstrap-authkey/)に従ってSAMユーザーを作成し、ブートストラップを実行してください。この後の手順での指定のため、設定ファイルであるarc.jsonは/etc/arc.jsonのパスに作成します。実行すると費用が発生するのでお気をつけください。
(SAMユーザーの作成は省略します)

```
soratun --config /etc/arc.json bootstrap authkey
Not enough information to bootstrap. Launching wizard.
SORACOM API auth key ID (starts with "keyId-"): **************************************
✔ SORACOM API auth key (starts with "secret-"): ***********************************************************************█
✔ Japan coverage (api.soracom.io)
Virtual subscriber SIM ID: 890000XXXXXXXXXXXXX
Created/updated configuration file: /etc/arc.json
```

サービスとして動作させるため、以下のようなサービスファイルを作成します。

```
[Unit]
Description=soratun
Documentation=https://users.soracom.io/
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
# ExecStartPre=/usr/local/bin/soratun bootstrap cellular --config /etc/arc.json
ExecStart=/usr/local/bin/soratun up --config /etc/arc.json
Restart=always
StandardOutput=journal
StandardError=journal
SyslogIdentifier=soratun
SyslogFacility=local7
WatchdogSec=120

[Install]
WantedBy=multi-user.target
```

これはconf/soratun.service.sampleに入っているので、/etc/systemd/system/soratun.serviceにコピーします。(そのまま使えるように設定ファイルを/etc/arc.jsonとしました)あとはサービスを起動すればOKです。

```
cp conf/soratun.service.sample /etc/systemd/system/soratun.service
systemctl enable soratun
systemctl start soratun
```

これでSORACOM Arcの接続は終わりです。SORACOM Airメタデータサービスにアクセスできるかみてみましょう。

```
curl http://metadata.soracom.io/v1/subscriber
No group ID is specified: 999999XXXXXXXXX
```

アクセスはできてますね。グループが設定されていないので、メタデータサービスを有効にしたグループを設定しておきましょう。

```
curl http://metadata.soracom.io/v1/subscriber
{"imsi":"999999XXXXXXXXX","msisdn":null,"ipAddress":null,"operatorId":"OPXXXXXXXXXX","apn":"arc.soracom.io","type":"arc.standard","groupId":"XXXX","createdAt":1624804534104,"lastModifiedAt":1624804960584,"expiredAt":null,"registeredTime":null,"expiryAction":"doNothing","terminationEnabled":true,"status":"active","tags":{},"sessionStatus":{"lastUpdatedAt":1624804534228,"imei":null,"location":null,"ueIpAddress":"XXXX","dnsServers":["0.0.0.0","0.0.0.0"],"online":true,"subscription":"planArc01"},"arcSessionStatus":{"lastUpdatedAt":1624804534228,"arcClientPeerIpAddress":"XXXX","arcClientPeerPublicKey":"XXXX","arcServerPeerPublicKey":"XXXX","arcServerEndpoint":"link.arc.soracom.io:11010","arcAllowedIPs":["100.127.0.0/16"]},"imeiLock":null,"speedClass":"arc.standard","simId":"890000XXXXXXXXXXXXX","moduleType":"virtual","plan":0,"iccid":"890000XXXXXXXXXXXXX","serialNumber":null,"subscription":"planArc01","lastPortMappingCreatedTime":null,"packetCaptureSessions":null,"arcClientPeerPublicKey":"XXXX","lastModifiedTime":1624804960584,"expiryTime":null,"createdTime":1624804534104}
```

まずEC2でのArcの利用はこれでいいですね。次にルーターとしての設定をします。

## NATインスタンスのルーターとしての設定(パケット転送許可、NAPT)

Linuxは初期状態では自分宛でないパケットを転送しません。これを許可するためにカーネルの設定を変更します。

```
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
```

次にiptablesにて転送の許可、NATの設定をします。まず初期状態を確認します。

```
iptables -t filter -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
```

Amazon Linux2のデフォルトはINPUT、FORWARD、OUTPUTが全て許可されています。これでいいのか？という気がしないでもないですが、セキュリティグループで防御されている前提なのでしょう。

NAT設定もみてみましょう。

```
iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
```

こちらもPREROUTING、INPUT、OUTPUT、POSTROUTINGはルールなしで、全て許可されています。
この場合、追加で必要になる設定は、インターネットおよびSORACOMサービスへ通信を中継する際のソースNAPT(MASQUERADE)設定のみです。以下の設定をしましょう。

```
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o soratun0 -j MASQUERADE
```

プライベートサブネット(10.0.1.0/24)から届いてeth0にルーティングされるもの、soratun0にルーティングされるものをそれぞれMASQUERADEに指定しています。

この設定を保存するためには、iptables-servicesというパッケージを入れる必要があります。インストールして、saveしておきましょう。再起動時に同じ設定が再現されるはずです。

```
yum install -y iptables-services
service iptables save
```

これでルーターとしての設定も終わりました。プライベートサブネットに立ち上げたものであれば、EC2インスタンスだろうがFargateのコンテナだろうが、Lambda関数の実行環境だろうがSORACOMサービスにアクセスできるはずです。試してみましょう。

## Lambda関数の作成・テスト

関数の作成をします。
![スクリーンショット 2021-06-28 0.21.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2308bb9b-0391-0ebb-cba2-0c41116b11c5.png)

関数の設定をします。VPCの設定が必要であることに注意しましょう。ちなみに基本的な権限は通常はCloudWatchLogsへの書き込み権限ですが、VPCの設定がある場合はLambda用ネットワークインタフェースの作成権限がつきます。それ以外の権限は必要ありません。
![スクリーンショット 2021-06-28 0.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4c68c6bc-d89c-76f3-d171-55f20f835573.png)

ひとまずメタデータからデータを取得する簡単なコードで確認しましょう。

```
require 'json'
require 'net/http'
require 'uri'

def lambda_handler(event:, context:)
  puts "Access to SORACOM Air Metadata service."
  uri = URI.parse("http://metadata.soracom.io/v1/subscriber")
  response = Net::HTTP.get_response(uri)
  { code: response.code, body: response.body }
end
```

Deployボタンを忘れずに
![スクリーンショット 2021-06-28 0.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/6f0d05f0-6cd7-7a19-dd06-6f585421ead4.png)

実行してみます。
![スクリーンショット 2021-06-28 0.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/80827b65-f7f0-88e1-76b2-2927a912da3f.png)

あっさり成功しました！準備ができていると楽なんですね。
![スクリーンショット 2021-06-28 0.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/b1e5f0ac-db85-386b-d9be-fa87975d0c70.png)

あとは、BeamでWebにアクセスするなり、Funkで他のクラウドの処理を起動するなり、Harvest Dataにメトリクスを送ってLagoonで可視化するなり、Harvest Filesにファイルを保存するなり、色々やってみましょう。

# 何に使えるの？

Webから取得できる情報をメトリクスとしてHarvest Dataに送ってLagoonで可視化するのが良いのではないかと思います。Lagoonの可視化、アラート機能も強化されたので、収集・可視化のサービスとしては手軽に使えて良いです。Harvest Dataは1日2000回(だいたい1分に1回)までは5円で使えるのですが、これはメトリクスの数によりません。なので複数のメトリクスを1回で送っても1日5円で使えて実はかなりお得です。

また、なんらかのイベントが発生したらLambdaが起動する、という仕組みの場合、Lambdaから呼ばれるサービスはLambdaで個々に対応しないといけないのですが、SORACOMのUnified Endpointとかに送っておけば、そこから連携するサービスは全て使えることになります。自分が手を入れなくても、SORACOMに進化に合わせて対応も広がるでしょう。

色々使い方はあるのではないかと思っています。

# おわりに

SORACOM ArcをLambdaで使う方法を考えてみました。(SORACOM Arcの話なのに大半がNATインスタンスの作り方になってしまいました。。)ただ、これがベストというわけではありません。

まずせっかく起動していない時は無料のLambdaなのに、この構成ではNATインスタンスの維持費がかかってしまいます。定常的に処理が発生するならいいですが、ほとんど発生しない時は勿体無いですね。そういう場合は今のところコンテナなどを使う方が良さそうです。

また、SORACOMはデバイスをIMSI(SIMの識別ID)で識別できるという長所があるのですが、この構成だと全てNAT インスタンス内のIMSIになってしまうため、個体識別ができなくなることあげられます。同じLambda関数の、複数の実行環境は同じものとして扱っていいようにも思いますが、複数種類の処理を同じNATインスタンスの下に入れると全部同じになってしまいます。識別したいんだったら関数ごとにサブネットとNATインスタンスを分けないといけないので、構築、運用の負担が大きそうです。

とはいえ、とりあえずできる方法ではあるので、使える方法が広がりました。また、この考えはLambdaだけではなく、他のクラウドやオンプレのシステムでもArcに繋がるルーターを用意すれば同じようにできます。ちょっとSORACOM使ってみたい、という時には試しやすい構成かなと思います。

まだまだ、色々な構成や使い方を考えていきたいですね。