AlibabaCloud FunctionComputeを使って日中間VPC接続を実現する

#概要
前回投稿した[SORACOM LTE-M Button for EnterpriseとAlibaba Cloud Function Computeを連携する](https://qiita.com/yoshii_channel/items/4a9a35d5130d94c05ba8)の続きのお話です。

SORACOMしろボタンで日中間NWを構築するために、
AlibabaCloudのFunctionCompute(AWSで言うとLambda)で、日本と上海に構築してあるVPCをCENというサービスにアタッチする処理を用意しました。
処理の流れは以下のイメージです。
![3f6nm-vahls.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/73f0f98f-fecf-104f-070d-097ca4b5edb2.gif)
#CEN(CloudEnterpriseNetwork)とは
CENとは、VPC間、またはVPCとオンプレ間をつなげられる、ネットワーク同士を接続するAlibabaCloudのサービスです。一押しサービスなのですが詳細は省きます。もっと知りたい方は[ドキュメント](https://jp.alibabacloud.com/help/doc-detail/59870.htm)をご覧ください。

#FunctionCompute(HTTPトリガー)でVPCをCENにアタッチさせる処理を書く
2リージョン(日本・上海)には既にVPCを構築しているものとします。
今回はPythonで記述しています。コードを書く際は、[OpenAPIExplorer](https://api.aliyun.com/)のSDKサンプルに助けられました。
コードは以下です。(どんな場合でもステータスコード200を返すようになっていますがあしからず…)
※aliyunsdkをアップロードしておく必要があります

<details><summary>attachVPC_to_CEN.py</summary><div>

```python:attachVPC_to_CEN.py
/#!/usr/bin/env python
/#coding=utf-8
/#CENがデタッチされていることを確認
import logging
import json
import requests
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcbn.request.v20170912.AttachCenChildInstanceRequest import AttachCenChildInstanceRequest

client = AcsClient(os.environ['AccessKey'], os.environ['AccesskeySecret'], 'ap-northeast-1')

request = AttachCenChildInstanceRequest()
request.set_accept_format('json')

/#CENに日本のVPCをアタッチする
request.set_CenId("アタッチ先CENのID")
request.set_ChildInstanceId("アタッチしたい日本VPCのID")
request.set_ChildInstanceType("VPC")
request.set_ChildInstanceRegionId("ap-northeast-1")

request2 = AttachCenChildInstanceRequest()
request2.set_accept_format('json')

/#CENに上海のVPCをアタッチする
request2.set_CenId("アタッチ先CENのID")
request2.set_ChildInstanceId("アタッチしたい上海VPCのID")
request2.set_ChildInstanceType("VPC")
request2.set_ChildInstanceRegionId("cn-shanghai")

/#ボタンにステータスコード200を返す
jsonDict = {"StatusCode":200}
jsonDict=json.dumps(jsonDict)

/#main
def handler(environ, start_response):
    context = environ['fc.context']
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
        if k.startswith('HTTP_'):
            pass
    response = client.do_action_with_exception(request)
    response2 = client.do_action_with_exception(request2)
    print(str(response, encoding='utf-8'))
    print(str(response2, encoding='utf-8'))
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [bytes(jsonDict,'utf-8')]
```

</div></details>

上記処理を記載したFCのHTTPトリガーエンドポイントを、
SORACOMBeamに設定します。
#SORACOMBeamの設定
参考までにスクリーンショットを記載します。
####SORACOMBeam設定
![beam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/d41268b7-ba63-fc41-556a-36035d342287.png)

####Unified Endpoint設定
![beam2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/52fc84a1-7a6d-e0ad-5c5f-39235f74f934.png)
####UDP→HTTPS設定
![beam3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/330800f2-24e8-2e32-3031-e454d1c59829.png)
※ヘッダ操作、レスポンスの各設定項目はOFFなので省きました。事前共有鍵は用いてないです。

あとはボタンをぽちっと押すだけで、
日中間NWの構築ができます！

#まとめ
簡単ではありますが、FunctionComputeを使ってVPCをCENにアタッチする方法と、SORACOMBeamの設定値をご紹介しました。
どなたかの参考になれば幸いです！