こんにちは、中山( @k1nakayama ) です。
今年もre:inventにて大量のアップデートや新サービスが発表されています。今回は、その中でStep Functionsから外部APIがコールできるようになったので、この機能について、実際にどのような形で使うのかを含め解説いたします。
公式ニュース:
- Step Functionsから使えるようになった外部APIコール機能について知りたい方
- ノーコード開発を行いたい方
- 既存のStep Functionsで、LambdaからAPIコールを行っている方
何が嬉しいの?
そもそもStep Functionsは、入力されたイベントに対して、様々なAWSサービスと統合して処理を逐次実行していったり、条件分岐や繰り返し処理を行うことを定義することができ、いわばLambda Functionで行っているような処理を、ノーコードで実行することができるワークフローを提供するサービスです。
これまでは、何百ものAWSサービスのAPIをStep Functionsからコールすることが出来たため、それだけでもS3に保存されたCSVデータに対して、ETL処理を行いDBに保存する、といった処理などを比較的簡単にワークフローとして作成することが出来ました。
しかし、これは全てがAWS内に留まっている場合は、ノーコードである程度実装できたのですが、AWS外のAPIをコールするような場面が現れた場合、これまでは外部APIを処理するためだけのLambdaを作成し統合する必要がありました。
サーバーレスなアプリケーションに限りませんが、昨今のアプリケーションでは、様々なSaaSを組み合わせて実装していることも多いかと思います。例えば、SalesforceやKintoneなどの業務データの管理に使用しているものを使うケースや、Stripeなどの決済サービスとの連携など、多くの外部サービスと統合していることだと思います。
今回のアップデートにより、これらの外部APIを直接呼び出すことが出来るようになりました。これにより、外部APIからデータを取得して、次の処理を回すことをLambdaでの実装をせずにStep Functionsの機能で実装することが出来るようになります。
また、以前にAPI送信についてEventBridge API Destinationsという機能が使えるようになったことを書きましたが、この機能の場合、残念ながらAPIをコールすることは出来ても、コールした結果を使用して次の処理を行うことは出来ませんでした。今回のStep Functionsの外部APIコール機能を使用することでこの辺りの課題も解決できるようになりました。
更に、外部APIではリクエストに対してレスポンスまでの時間が長く掛かるようなAPIもあります。このような場合は、Lambdaで実装すると無駄にLambdaの実行時間に対する課金が発生してしまいますが、今回の外部APIコール機能を使用すると、そのような無駄なコストは発生しません。
様々な点で利点があるかと思います
設定してみる
今回は、試しにOpen Exchange Ratesというサービスを使用し、指定日のドル円の為替レートを取得し、DynamoDBに保存する流れを作成したいと思います。
※ちなみに、本当は前日の為替レートを取得して保存したかったのですが、前日の日付を取得することがどうしてもそれだけのためのLambdaを作らなければならなくなり、ノーコード感が薄れるため、今回は指定日という形にしました。。。
まずは、Open Exchange Ratesのサイトにサインアップし、AppIdを取得しておきましょう
続いて、保存をするDynamoDB Tableを作成しておきます。今回こちらはテーマとは逸れるため、設定内容のみ記載しておきます。
テーブル名: rates
HASHキー名: date (文字列)
続いてStep Functionsのステートマシンを作成していきます。
テンプレートはBlankを選択してデザインモードで編集画面に移りましょう
次に、左ペインのアクションから、call third-party APIをフローにドラッグしてください。状態名は「GetRate」としておきます
続いて、APIコールの設定です。今回はペイロードに下記のような形で、指定日を受け取ることを想定したいと思います。
{
"target_date": "2023-11-29"
}
これを想定して、指定日の為替情報を取得するURLは下記のようになります
https://openexchangerates.org/api/historical/2023-11-29.json?symbols=JPY
このように、リクエスト先のエンドポイントの一部をペイロードから与えたいため、APIパラメータの設定は、「状態入力からランタイムにAPIエンドポイントを取得」を選択し、エンドポイントの入力欄には下記のように入力しましょう。これによりURLの一部をペイロードで置き換えることが出来ます。
States.Format('https://openexchangerates.org/api/historical/{}.json', $.target_date)
このエンドポイント欄には、クエリパラメータを含めることが出来ません。クエリパラメータは詳細パラメータを開いたところにあるクエリパラメータ欄で設定します
{
"symbols": "JPY"
}
メソッドは今回GETメソッドを使用しますのでGETを選択してください
次に認証についての設定です。この部分は、EventBridge API Destinationsによって登場したAPI接続先設定を使用しているようです。新規に接続先を登録しますので、「新しい接続先を作成」を選択してください
Open Exchange RatesはクエリパラメータでAppIdを与えるだけで認証できるようですが、Authorizationヘッダーに与えることも可能です。今回はこの方法を使用します。
接続先名は「Open Exchange Rates」と入力しておき、認証設定欄では、APIキーとして設定を行ってください。
APIキー名のヘッダー名には「Authorization」値には「Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」という形で入力しましょう
接続先を作成して選択できたら、GetRatesのパネルで続いて「出力」タブを選択します
まずは、APIのレスポンスから一部の情報だけ次の処理に渡したいので、「ResultSelector を使用して結果を変換」の設定を行います。下記のように設定してください
{
"rate.$": "$.ResponseBody.rates"
}
これによって、JPYの為替レートのデータだけがrateとして渡せます
続いて、指定日もDynamoDBの保存に使いたいため、「ResultPath を使用して元の入力を出力に追加」の設定で、「Combine original input with result」を選択した上で、下記の様に設定します
$.rate_response
外部API呼び出しの設定は以上で完了です。
最後に取得した情報をDynamoDBに保存しましょう
DynamoDB PutItemのアクションをフローに追加しましょう
設定のAPIパラメータ欄は下記のように設定してください
{
"TableName": "rates",
"Item": {
"date": {
"S.$": "$.target_date"
},
"rate": {
"N.$": "States.Format('{}', $.rate_response.rate.JPY)"
}
}
}
ワークフローを保存して設定が完了です
実行してみる
新しい実行ボタンを選択し、下記のようにペイロードを入力してみてください
{
"target_date": "2023-11-29"
}
実行を開始して程なくすると、下記のように実行が完了します。これでAPIリクエスト結果がDynamoDBに保存がされたはずです。
実際にDynamoDBでテーブルのデータを参照してみましょう
見事に指定日の為替レートが取得され、DynamoDBに保存できています。
まとめ
いかがだったでしょうか?
簡単なAPIコールではあるものの、プログラムをコーディングすることなく、Step Functionsから為替レート取得処理を実装できました
今回は単純な処理ではありましたが、応用すると様々なAPIコールを連続して行っていくような場面でも、Step Functionsのみで実装していくことができます。場合によってはプログラミング言語には抵抗がある方でも、機能開発に貢献できる可能性がありますね。