OCI API Gateway経由でStreamingのメッセージを読み込む方法を確認する

# はじめに
こちらのチュートリアルを参考に、REST APIをコールして、API Gateway経由でStreamingのメッセージを読み込みます。

https://docs.oracle.com/en/learn/oci-streaming-api-gateway/index.html#introduction

アーキテクチャはこのようになります。
StreamingはメッセージをPutするProducerとGetするConsumerが必要ですが、今回はStreaming自身がサンプルメッセージを生成して、それをGetするだけの簡単なアーキテクチャです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/a4821a07-ddb7-3b81-7a5f-8e790121b8f2.png)

# Streamの作成

OCIコンソールの`ストリーミング`から`ストリームの作成`をクリックします。

任意の名称を設定して、`Auto-Create a default stream pool`を選択して、デフォルトストリームプールを合わせて作成します。

![スクリーンショット 2023-08-22 16.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/8cc6461d-31ed-2279-9c87-09398b18fbdd.png)

作成後のコンソールに表示される`OCID`と`メッセージ・エンドポイント`をメモしておきます。

![スクリーンショット 2023-08-22 16.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/795518eb-0c61-22ad-01fd-f24a978eea7c.png)

# API Gatewayの作成
OCIコンソールの`APIゲートウェイ`から`ゲートウェイの作成`をクリックします。
以下のようにしてAPI Gatewayを作成します。なお、VCN、サブネットは作成済みです。

![スクリーンショット 2023-08-22 16.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/2af70dab-3aec-90f5-65ba-0f359d620fab.png)

## デプロイメント作成
作成したAPI Gatewayのコンソールから`デプロイメント` `デプロイメントの作成`をクリックします。

パス接頭辞は、先ほどメモしたストリームのOCIDと置き換えて、以下のようにします。

`/20180418/streams/your_ocid_for_stream`

![スクリーンショット 2023-08-22 16.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/3bf1b819-0421-3ae2-e93b-d74315fccb5c.png)

今回は認証なしにします。

![スクリーンショット 2023-08-22 16.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/bfa70348-ea7d-0d76-7503-f687843bace5.png)

ルートは2つ設定します。
`1のルーティング`は以下のように設定します。
URLは以下の書式で、先ほどメモしたストリーミング・エンドポイントとストリームOCIDで置き換えます。

`<streaming_endpoint>/20180418/streams/<stream_ocid>/groupCursors
`

![スクリーンショット 2023-08-22 16.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/dd19918a-a3d7-e7f3-d3ec-de74fa64bb25.png)

`+別のルート`をクリックして、`2のルーティング`を追加します。
URLは1のルーティングと同様ですが、最後の`/groupCursors`を`/messages`に置き換えます。

![スクリーンショット 2023-08-22 17.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/ed7a56b3-dd27-007b-93db-919c67930999.png)

# 動作確認
## テストメッセージの作成
ストリームのコンソールで`テスト・メッセージの生成`をクリックします。

今回はとりあえずこのようなメッセージを作成します。

![スクリーンショット 2023-08-23 10.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/b8dfec03-fd36-34f5-8c0a-1c09356da248.png)

同様にもう一つメッセージを作成しました。
`メッセージのロード`をクリックすると、作成したメッセージが表示されます。

![スクリーンショット 2023-08-23 10.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/d98830f8-4c47-0267-e33b-5e2c292bd855.png)

## サンプルコードからのテスト
サンプルコードをダウンロードします。

```
$ wget https://docs.oracle.com/en/learn/oci-streaming-api-gateway/files/consume_rest_api_oci_lab.py
--2023-08-23 01:52:15--  https://docs.oracle.com/en/learn/oci-streaming-api-gateway/files/consume_rest_api_oci_lab.py
Resolving docs.oracle.com (docs.oracle.com)... 104.120.11.151, 2600:140b:4800:49a::af5, 2600:140b:4800:480::af5
Connecting to docs.oracle.com (docs.oracle.com)|104.120.11.151|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3253 (3.2K) [text/plain]
Saving to: 'consume_rest_api_oci_lab.py'

consume_rest_api_oci_lab.py                            100%[============================================================================================================================>]   3.18K  --.-KB/s    in 0s      

2023-08-23 01:52:15 (58.7 MB/s) - 'consume_rest_api_oci_lab.py' saved [3253/3253]
```

サンプルコードのうち、以下の2ヶ所を環境に合わせて修正します。

- base_endpoint
    - API Gatewayのデプロイメントのエンドポイントのうち、`streams/`までを記載します。
![スクリーンショット 2023-08-23 16.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/0659f0a7-a2e5-a411-579b-de48c4224103.png)

- stream_ID
    - ストリームのOCID
    

```
    73  # set your endpoint and stream OCID properly
    74  base_endpoint = 'https://evu5xxxxxxxxxmkyh2po3gg2u.apigateway.uk-london-1.oci.customer-oci.com/20180418/streams/'
    75  stream_ID = 'ocid1.stream.oc1.uk-london-1.amaaaaaassl65iqawvdfsa5xff574vrjwfsosv7pugxxxxxxxxxxxxxsrla'
```

Pythonのコードを実行してメッセージが表示されることを確認します。
下から3行目、4行目にメッセージが表示されています。

```
$ python3 consume_rest_api_oci_lab.py

Starting new HTTPS connection (1): evu54qn2bo37z2u.apigateway.uk-london-1.oci.customer-oci.com:443
send: b'POST /20180418/streams/ocid1.stream.oc1.uk-london-1.amaaaaaassl65iqawvdfsa5sosv7pug5qzzprfpf275wusrla/groupCursors HTTP/1.1\r\nuser-agent: python-requests/2.20.0\r\naccept-encoding: gzip, deflate\r\naccept: */*\r\nconnection: keep-alive\r\nContent-Length: 56\r\ncontent-type: application/json\r\ndate: Wed, 23 Aug 2023 01:56:24 GMT\r\nhost: evu54qn2bo37z2mkyh2po3gg2u.apigateway.uk-london-1.oci.customer-oci.com\r\nx-content-sha256: 32DcAKNbkZhzjroRYHgDS2QQx2YBKOtQRNtqcDowh+E=\r\nauthorization: Signature algorithm="rsa-sha256",headers="date (request-target) content-length content-type x-content-sha256",keyId="ocid1.tenancy.oc1..aaaaaaaa3mb7wrcy2ls3u3jsy2soq5ck3lc3q4mczitpdaymbuazc5tkguca/ocid1.user.oc1..aaaaaaaa4scxbela7cohxnxpj3vmi46b6uaar2fmcfs7pnbqxpqno6pgasfa/2a:9a:80:b0:bb:82:57:dc:99:e1:e2:95:dc:7b:4a:a6",signature="BczrLcEQdFUOn4ynCeMoITFeIxeSzD1bHGCiNcBgIMY3oevNtyXhQq+IX74UjhAuatbkLnKHgz32mvmG1wqJ2lfYagYnVAzKqITgnH+Jd+Us20Fwdy/uSn2qLOLRxoJC0rGvmsJiZmc7hkqJRDXcsHOSOIuyCUX3I2DWbTgSQqzRlQgEZl72lM/ueiCJlQM9QNBpacd/lbIqEohqUt+i/C2dl3RAIS5DE1MJhfpvQHE0WD3F5kxppoL7nDJjMIFJfZE8DZDxXvbckOe5Bu7SuBH8ppik8dYzjjDw==",version="1"\r\n\r\n'
send: b'{"groupName": "MyTestGroupName", "type": "TRIM_HORIZON"}'
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Wed, 23 Aug 2023 01:56:25 GMT
header: Content-Type: application/json
header: Connection: keep-alive
header: Content-Length: 444
header: Server: Oracle API Gateway
header: X-Frame-Options: sameorigin
header: access-control-allow-methods: POST, PUT, GET, HEAD, DELETE, OPTIONS
header: opc-request-id: /00DE2CD06B1E0FCFC811FC8FEA8215BB/6AF0037D72FDA961117D209E9C892F8F
header: access-control-expose-headers: access-control-allow-credentials, access-control-allow-methods, access-control-allow-origin, connection, content-length, content-type, opc-client-info, opc-request-id
header: Strict-Transport-Security: max-age=31536000
header: access-control-allow-origin: *
header: X-Content-Type-Options: nosniff
header: X-XSS-Protection: 1; mode=block
header: access-control-allow-credentials: true
https://evu54qn2bo37z2mkyh2po3gg2u.apigateway.uk-london-1.oci.customer-oci.com:443 "POST /20180418/streams/ocid1.stream.oc1.uk-london-1.amaaaaaassl65iqaff574vrjwfsosv7pug5qzzprfpf275wusrla/groupCursors HTTP/1.1" 200 444
Starting new HTTPS connection (1): evu54qn2bo37z2m2u.apigateway.uk-london-1.oci.customer-oci.com:443
send: b'GET /20180418/streams/ocid1.stream.oc1.uk-london-1.amaaaaaassl65iqa574vrjwfsosv7pug5qzzprfpf275wusrla/messages?cursor=eyJjdXJzb3JUeXBlIjoiZ3JvdXAiLCJzdHJlYW1JZCI6Im9jaWQxLnN0cmVhbS5vYzEudWstbG9uZG9uLTEuYW1hYWFhYWFzc2w2NWlxYXd2ZGZzYTV4ZmY1NzR2cmp3ZnNvc3Y3cHVnNXF6enByZnBmMjc1d3VzcmxhIiwiZXhwaXJhdGlvbiI6MTY5MjAtMGU2MS00Y2RkLThlMTUtMDExOGQ5OWYzNDVkIiwib2Zmc2V0cyI6e30sImNvbW1pdE9uR2V0Ijp0cnVlLCJnZW5lcmF0aW9uIjowLCJ0aW1lb3V0SW5NcyI6MzAwMDAsImN1cnNvclR5cGUiOiJncm91cCJ9&limit=1000 HTTP/1.1\r\nuser-agent: python-requests/2.20.0\r\naccept-encoding: gzip, deflate\r\naccept: */*\r\nconnection: keep-alive\r\ncontent-type: application/json\r\ndate: Wed, 23 Aug 2023 01:56:25 GMT\r\nhost: evu54qn2bo37z2mkyh2po3gg2u.apigateway.uk-london-1.oci.customer-oci.com\r\nauthorization: Signature algorithm="rsa-sha256",headers="date (request-target)",keyId="ocid1.tenancy.oc1..aaaaaaaa3mb7wrcy2ls3u3jsy2soq5ck3lc3q4mczitpdaymbuazc5tkguca/ocid1.user.oc1..aaaaaaaa4scxbelai46b6uaar2fmcfs7pnbqxpqno6pgasfa/2a:9a:80:b0:bb:82:57:dc:99:e1:e2:95:dc:7b:4a:a6",signature="OyRE5seRVO1QpG8B2ZRPN5Pva+TNk4Rhey89pFn/+BTn2EIKBYz1ro16xG/IAWcxeLMyHA8d6gpvKpOU2EZdw7DUS4czsrr2DVyVDfjANcfyWqauxeveGuSxfaj7FLEuqX2TQKvdhl/wtV2EiEZ7d9i1ahTsL0C591dB7XEMZyUtXLOY4Whyl0jBWqpFie/F3RHaSeWfYP8pUR/bB1+re2eiCkIkFU72iawMaFZLsGv2FhRmovF40tLYcbLJU/ELE7AdUT9o5LAtJm2Gp/a03Nr40xkFz/Di9JgyvRJsg0AsDvrrnsMI6f3NyUjtDE/Qw7NaXJvJg==",version="1"\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Wed, 23 Aug 2023 01:56:26 GMT
header: Content-Type: application/json
header: Connection: keep-alive
header: Content-Length: 333
header: Server: Oracle API Gateway
header: opc-next-cursor: eyJjdXJzb3JUeXBlIjoiZ3JvdXAiLCJzdHJlYW1JZCI6Im9jaWQxLnN0cmVhbS5vYzEudWstbG9uZG9uLTEuYW1hYWFhYWFzc2w2NWlxYXd2ZGZzYTV4ZmY1NzR2cmp3ZnNvc3Y3cHVnNXF6enByZnBmMjc1d3VzcmxhIiwiZXhwaXJhdGlvbiI6MTY5Mjc1NjA4NjQ2MiwiZ3JvdXBOYW1lIjoiTXlUZXN0R3JvdXBOYW1lIiwiaW5zdGFuY2VOYW1lIjoiMzQ2MzhmMjAtMGU2MS0pb24iOjAsInRpbWVvdXRJbk1zIjozMDAwMCwiY3Vyc29yVHlwZSI6Imdyb3VwIn0=
header: X-Frame-Options: sameorigin
header: access-control-allow-methods: POST, PUT, GET, HEAD, DELETE, OPTIONS
header: opc-request-id: /DC59F76DB071CDAE8332390F33AC64A8/ECF570E1F2787580F2357D
header: access-control-expose-headers: access-control-allow-credentials, access-control-allow-methods, access-control-allow-origin, connection, content-length, content-type, opc-client-info, opc-next-cursor, opc-request-id
header: Strict-Transport-Security: max-age=31536000
header: access-control-allow-origin: *
header: X-Content-Type-Options: nosniff
header: X-XSS-Protection: 1; mode=block
header: access-control-allow-credentials: true
https://evu54qn2bo37z2mkyh2po3gg2u.apigateway.uk-london-1.oci.customer-oci.com:443 "GET /20180418/streams/ocid1.stream.oc1.uk-london-1.amaaaaaassl65iqawvdfsa5xff574vrjwfsosv7pug5qzzprfpf275wusrla/messages?cursor=eyJjdXJzb3JUeXBlIjoiZ3JvdXAiLCJzdHJlYW1JZCI6Im9jaWQxLnN0cmVhbS5vYzEudWstbG9uZG9uLTEuYW1hYWFhYWFzc2w2NWlxYXd2ZGZzYTV4ZmY1NzR2cmp3ZnNvc3Y3cHVnNXF6enByZnBmMjc1d3VzcmxhIiwiZXhwaXJhdGlvbiI6MzQ2MzhmMjAtMGU2MS00Y2RkLThlMTUtMDExOGQ5OWYzNDVkIiwib2Zmc2V0cyI6e30sImNvbW1pdE9uR2V0Ijp0cnVlLCJnZW5lcmF0aW9uIjowLCJ0aW1lb3V0SW5NcyI6MzAwMDAsImN1cnNvclR5cGUiOiJncm91cCJ9&limit=1000 HTTP/1.1" 200 333
[MESSAGE] This is test message1 from streaming.
[MESSAGE] This is test message2 from streaming.
Next Cursor for calling: 
eyJjdXJzb3JUeXBlIjoiZ3JvdXAiLCJzdHJlYW1JZCI6Im9jaWQxLnN0cmVhbS5vYzEudWstbG9uZG9uLTEuYW1hYWFhYWFzc2w2NWlxYXd2ZGZzYTV4ZmY1NzR2cmp3ZnNvc3Y3cHVnNXF6enByZnBmMjc1d3VzcmxhIiwiZXhwaXJhdGlvbiI6MTY5Mjc1NjA4NjQ2MiwiZ3JvdXBOYW1lIjoiTXlUZXN0R3JvdXBOYW1lIiwiaW5zdGFuY2VOYW1lIjoiMzQ2Mz25HZXQiOnRydWUsImdlbmVyYXRpb24iOjAsInRpbWVvdXRJbk1zIjozMDAwMCwiY3Vyc29yVHlwZSI6Imdyb3VwIn0=
```