[アップデート] API Gateway HTTP API で AWS サービス統合が利用可能になりました

HTTP API で AWS サービス統合がサポート!またひとつ REST API から乗り換えハードルが下がりましたね!
2020.08.21

本日のアップデートで API Gateway HTTP API で AWS サービス統合が利用できるようになりました。

何が嬉しいのか

これまで HTTP API では AWS サービス統合はサポートされておらず、バックエンドの AWS サービスを利用したい場合は Lambda またはコンテナなど何らかの HTTP バックエンドにリクエストをルーティングし、そこから AWS サービスエンドポイントにアクセスする必要がありました。

今回のアップデートにより、このようなプロキシを利用せずとも HTTP API から直接 AWS サービスへのリクエストが可能となりました。

REST API では既に利用できる機能でしたので、HTTP API への置き換えることが出来ない要因の 1 つであったかと思いますが、これでまた 1 つ障壁が取り除かれましたね。

対応サービス

とはいえ、今回のアップデートでサポートされるサービスは以下の 5 つです。対応しているアクションについてもあわせてご確認ください。

  • EventBridge
    • イベントの送信
  • SQS
    • メッセージの送信、受信、削除
  • AppConfig
    • AppConfig 構成の取得
  • Kinesis Data Streams
    • データストリームへ送信
  • StepFunctions
    • ステートマシンの開始、停止

まだまだ REST API に比べると数が少ないですが、今後の追加サポートに期待しましょう。

やってみる

今回は SQS との統合で確認します。

事前準備

以下のリソースは事前に作成しておきます。

  • SQS
  • IAM ロール

IAM ロールは HTTP API の Invocation role で指定するものです。以下のように apigateway.amazonaws.com を信頼ポリシーに持つ IAM ロールを作成し、今回は AmazonSQSFullAccess ポリシーをアタッチしておきました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

HTTP API の作成

API Gateway の管理コンソールより、HTTP API を作成します。API 作成時には AWS Service の指定は出来ないようですので、まずは選択可能な HTTPLambda 統合をダミーで選択して作成しました。

ルートは /sqs/message として作成しました。

[開発] - [統合] を開き、先程作成したルートから 統合を作成してアタッチ をクリックします。

統合ターゲットから対象となる AWS サービスを選択します。今回は SQS を指定。

SQS の場合、Integration action には以下の 4 つが指定可能です。

  • SQS-SendMessage
  • SQS-ReceiveMessage
  • SQS-DeleteMessage
  • SQS-PurgeQueue

今回は SendMessage を指定します。

Integration action に必要なパラメータをリクエストからマッピングする設定を行います。SQS-SendMessage の場合、必須パラメータは QueueUrlMessageBody です。(今回は必須パラメータ以外は一旦無視しますが、実際の運用では必要に応じて他のパラメータも含めてください)

以下の例では SQS の MessageBody にマッピングするため $request.body.message を指定しています。.message は JSON パスです。今回 SQS の URL は固有のものを埋め込んでいますが $request.header.queueUrl のように定義してヘッダー指定で渡すことで柔軟に SQS を振り分けることも出来ます。

リクエストパラメータのマッピングおよび 各 Integration action必須パラメータは公式ガイドを参照ください。

同樣に GET メソッドに ReceiveMessage の統合を作成

DELETE メソッドに DeleteMessage の統合を作成しました。

HTTP API の自動デプロイを有効にしているので、設定の都度デプロイする必要はありません。自動デプロイ最高ですね。

動作確認

それでは動作を確認していきましょう。

SendMessage

今回、MessageBody には $request.body.message として送るように定義しましたので -d '{"message":"Classmethod"}' のように JSON パスを付与してメッセージを送ります。

$ curl -X POST https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message \
   -d '{"message":"Classmethod"}'
<?xml version="1.0"?>
<SendMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
	<SendMessageResult>
		<MessageId>2694375c-f8db-4497-87b1-ac9bc4a336ad</MessageId>
		<MD5OfMessageBody>1621732e43dd55bda452f7e5fd4ce368</MD5OfMessageBody>
	</SendMessageResult>
	<ResponseMetadata>
		<RequestId>87716c1c-e87e-57a9-a628-3ba5bc4dd496</RequestId>
	</ResponseMetadata>
</SendMessageResponse>

SQS のコンソールを確認するとメッセージが 1 になっているので、送信できていますね。

ReceiveMessage

次に、先程送ったメッセージを受信します。

$ curl -X GET https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message
<?xml version="1.0"?>
<ReceiveMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
	<ReceiveMessageResult>
		<Message>
			<MessageId>2694375c-f8db-4497-87b1-ac9bc4a336ad</MessageId>
			<ReceiptHandle>AQEBm0Uin31YesF2XdHgyD6oVTNdGfqr8VXV4/3XWn5QK5eA0PsQb0APl3caXbh6W56HLlxnWe/C9ITaNBWvRoezuFjcVr11cYk0K05N/YeZbqxzY5f6qpg+1qdReyjpH19CUwok1qFaN7LEF12jhl1t8YIhuMrFeYt8qw4w9nwT1Gvv75pB1VduIBzanErS68ne2blBpklZg9lLD7pjUbwbLY7AcCpO0HHYIH6sTzlUkovYxxIxRxo9Yf/NvUZM1nVLG8gLFLPDykpmr9rXLqoDoo+HF+z6TshJLGLWFuTvDCs4A2coD09yt2PvSQx1CS6S3yntkJ4hR2I0lGDAHqXh4JAejkAIVXk51cAvt0cTcit2DLOzxVynJ5APk6bIJUxwNnz0Lsr8Wk9zMorTNpamfg==</ReceiptHandle>
			<MD5OfBody>1621732e43dd55bda452f7e5fd4ce368</MD5OfBody>
			<Body>Classmethod</Body>
		</Message>
	</ReceiveMessageResult>
	<ResponseMetadata>
		<RequestId>becdcf7f-9241-5aac-a175-98c6c60dbde0</RequestId>
	</ResponseMetadata>
</ReceiveMessageResponse>

送信したメッセージ Classmethod を正常に受信できました。

DeleteMessage

最後にキューのメッセージを削除します。キューの削除に必要な ReceiptHandle$request.body.receipthandle として送るように定義しています。値は先程受信したメッセージ内の ReceiptHandle の値を指定します。

$ curl -X DELETE https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message \
 -d '{"receipthandle":"AQEBm0Uin31YesF2XdHgyD6oVTNdGfqr8VXV4/3XWn5QK5eA0PsQb0APl3caXbh6W56HLlxnWe/C9ITaNBWvRoezuFjcVr11cYk0K05N/YeZbqxzY5f6qpg+1qdReyjpH19CUwok1qFaN7LEF12jhl1t8YIhuMrFeYt8qw4w9nwT1Gvv75pB1VduIBzanErS68ne2blBpklZg9lLD7pjUbwbLY7AcCpO0HHYIH6sTzlUkovYxxIxRxo9Yf/NvUZM1nVLG8gLFLPDykpmr9rXLqoDoo+HF+z6TshJLGLWFuTvDCs4A2coD09yt2PvSQx1CS6S3yntkJ4hR2I0lGDAHqXh4JAejkAIVXk51cAvt0cTcit2DLOzxVynJ5APk6bIJUxwNnz0Lsr8Wk9zMorTNpamfg=="}'

<?xml version="1.0"?>
<DeleteMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
	<ResponseMetadata>
		<RequestId>9a1f49f7-3638-5e58-a7f0-1e4e6290e0db</RequestId>
	</ResponseMetadata>
</DeleteMessageResponse>

AWS コンソールから確認すると先程は 1 でしたが 0 に変わっていますので、正常に削除まで完了できていますね。

検証は以上です。

さいごに

HTTP API はシンプルに構成ができ、パフォーマンスも早く、コストも安くて良いですね。これまで HTTP API に置き換え検討する際に、AWS サービス統合が利用できないことでボトルネックになっていた環境もあるかと思います。

今回のアップデートでは、ひとまず 5 つのサービスだけですがコレを皮切りに他の AWS サービス統合の追加サポートが増えてくるのであれば、ますます REST API から HTTP API への置き換えのハードルが下がりそうですね。今後も HTTP API から目が離せません!

SQS 以外のやってみた記事もいずれあがってくることでしょう!

以上!大阪オフィスの丸毛(@marumo1981)でした!