Lambdaを使っていろんなプラットフォームで使えるAPIを作ろう
🎮

Lambdaを使っていろんなプラットフォームで使えるAPIを作ろう

タグ
Symbol
公開日
December 24, 2021

みなさん、メリークリスマス。

お元気でしょうか?Opening Lineの松本です。

今回は非常に反響のあったUE4でのAPI実行の記事を作成することになりました。

記事は3本構成で以下の構成です

・Serverless FrameworkでAPIを作ろう

本記事です

・UnityでAPIを実行しよう

・Unreal Engine4で実行しよう

この3本になります。

さて今回はServerless FrameworkでAPIを作ろうの部分になります。

Serverless Frameworkとはコード管理でサーバーレスサービスを作れちゃうよというインフラストラクチャーアズアコードと呼ばれるものです。

ざっくりいうところの詠唱に当たります。

例えばみなさんご存知の鬼道の90番「黒棺」ですと

滲み出す混濁の紋章、不遜なる狂気の器、湧き上がり・否定し・痺れ・瞬き・眠りを妨げる 爬行(はこう)する鉄の王女、絶えず自壊する泥の人形、結合せよ、反発せよ、地に満ち 己の無力を知れ 破道の九十・黒棺

と詠唱をすると霊圧の塊が黒く塗りつぶされ、その中にいる対象物は息たえるというみなさんご存知の鬼道だと思います。

image

ここでいうところの詠唱がServerless Frameworkにあたりその詠唱での結果がAWSのリソースとして展開されます。

さてなのでまずはAWSの環境設定をしましょう。

サーバーレスフレームワークは色々な設定方法がありますので、ぜひご活用ください。(他の人の記事の方が勉強になります。)

プロジェクトの作成方法はこちら

このアプリケーションまでできると後は中身の部分を修正します。

handler.tsを編集するだけでOKです。

import { middyfy } from '@libs/lambda';import { APIGatewayProxyHandler } from 'aws-lambda';import {Account,Address,Deadline,PlainMessage,RepositoryFactoryHttp,TransferTransaction,UInt64,} from 'symbol-sdk';const hello: APIGatewayProxyHandler = async (event, _context) => {try {/* start block 01 */// replace with addressconst nodeUrl = 'ノードのURL';const repositoryFactory = new RepositoryFactoryHttp(nodeUrl);const epochAdjustment = await repositoryFactory.getEpochAdjustment().toPromise();const networkType = await repositoryFactory.getNetworkType().toPromise();const networkGenerationHash = await repositoryFactory.getGenerationHash().toPromise();// Returns the network main currency, symbol.xymconst { currency } = await repositoryFactory.getCurrencies().toPromise();/* start block 01 */// replace with recipient addressconst rawAddress = '受け取りのアドレス';const recipientAddress = Address.createFromRawAddress(rawAddress);const transferTransaction = TransferTransaction.create(Deadline.create(epochAdjustment),recipientAddress,[currency.createRelative(10)],PlainMessage.create('This is a test message'),networkType,UInt64.fromUint(2000000),);const privateKey ='秘密鍵';const account = Account.createFromPrivateKey(privateKey, networkType);const signedTransaction = account.sign(transferTransaction,networkGenerationHash,);console.log('Payload:', signedTransaction.payload);console.log('Transaction Hash:', signedTransaction.hash);const transactionRepository = repositoryFactory.createTransactionRepository();const response = await transactionRepository.announce(signedTransaction).toPromise();console.log(response);return { statusCode: 200, body: JSON.stringify(response, null, 2) }} catch (err) {console.error(err)return { statusCode: 500, body: JSON.stringify({ event, error: err.message }) }}}export const main = middyfy(hello);

後はデプロイを実施します

serverless deploy --aws-profile AWSプロファイル名

aws-cliを設定しているとそのプロファイルでデプロイが可能になります。

するとcloudformationテンプレートが作成されてローカルでcloudformationテンプレートが実行されてAWSの環境が作成されていくといった感じです。

後は作成されたAPIを叩けるようにするために

APIGatewayに行きメソッドリクエストのリクエストの検証を無しにします

image

これで下準備はできましたので今回POSTで通信するので

curl -XPOST APIのPOSTメソッドのURL

を実行してトランザクションが送信されていればOKです。

後はどのようなプラットフォームでもPOSTのリクエストさえできる環境であれば自由にカスタマイズできます。

例えばデータを受け取れる形にして送信先をコントロールする抽象度を上げることもできます。

なのでこのようなAPIを作っていくことがいろんなプラットフォームでも対応できるいい感じのものになるのかな?といった感じではあります

またこういうAPIの作り方(マルチシグとか)ありましたらご連絡ください。リソースの限りお手伝いできればと思います。(作り方だけです、AWSのリソースは有料のため、APIのURLを提供するのは難しいです(ご了承ください)

また開発で困ったことがありましたらご連絡ください。時間がありましたら対応可能です。