概要
ビットコイン(や他の暗号資産)を定期的に購入するようなアプリケーションを開発しました。暗号資産取引所(bitflyer)のAPIを定期的にコールするようなアプリケーションを開発し、クラウドインフラ(AWS)上で運用を行っています。
ソースコードは以下です。
↓↓↓
https://github.com/Kohei-Sato-1221/reserve-bitcoin-lambda
アプリケーションのアーキテクチャ
- AWSのクラウドインフラを用いて以下のようなアプリケーションを構築しました。
技術スタック
名称 | 説明 |
---|---|
AWS Lambda | サーバーレスアプリケーションを実現。Lambda関数で取引所のAPIをコールします。 |
Golang | Lambda関数はGolangで実装を行いました。 |
SAM(Serverless Application Model) | ローカルでLambdaの開発を行う際に使用。関数の雛形作成・関数のローカルでのエミュレート・関数のデプロイを行います。 |
Event Bridge | Lambda関数を定期的に実行する役割。 |
System manager(パラメータストア) | アプリケーションが使用するパラメータを格納。Lambdaがパラメータを取得します。 |
アプリ開発の経緯
2021年にビットコインの価格は600万円台に達し、暗号資産は投資の対象として非常に注目度が高まっています。しかし、暗号資産のボラティリティは大きいので、一回の注文で多額の暗号資産を購入してしまうと、大きな含み損が発生してしまう可能があります。
そこで、少額の暗号資産を定期的に購入することで、価格変動のリスクを避けるような購入をしたいと考えました。まさに、ドルコスト平均法の考え方を適応したわけです。
なぜ既存の積立機能を使わないのか?
bitflyerやCoinCheckなどでは、ビットコインの積立機能を提供しています。しかし、私はあえてこのようなアプリケーションを実装しました。理由は、価格の点です。既存の積立機能は、基本的に販売所の価格となっており、板取引で購入できる金額よりも手数料が上乗せされています。取引所で暗号資産を取引したほうが安く入手できるのです。
技術的な解説
以下ではアプリケーションをどのような手順で構築したか解説します。
SAM(Serverless Application Model)の導入
SAMとはLambdaのようなサーバーレスアプリケーションの開発する際に役に立つ便利ツールです。これを使えば、Lambda関数の雛形を作成したり、Lambda関数をローカルでエミュレートしたりする(わざわざデプロイしなくても挙動が確認できる)ことができます。
AWS SAM CLI
をローカルPCにインストールして、Lambdaの実装を開始しました。
新規注文APIをコールするLambda関数の実装
bitflyerのAPIをコールする機能をLambdaに実装しました。
func (client *APIClient) PlaceOrder(order *Order) (*OrderRes, error) {
method := "POST"
path := "/v1/me/sendchildorder"
url := baseURL + path
data, err := json.Marshal(order)
if err != nil {
return nil, err
}
header := client.getHeader(method, path, data)
res, err := utils.DoHttpRequest(method, url, header, map[string]string{}, data)
if err != nil {
return nil, err
}
var orderRes OrderRes
err = json.Unmarshal(res, &orderRes)
if err != nil {
return nil, err
}
if len(orderRes.ChildOrderAcceptanceId) == 0 {
return nil, errors.New(string(res))
}
return &orderRes, nil
}
APIキー・APIシークレットキーの扱い
取引所の注文を行うには取引所のAPIキー・APIシークレットキー
が必要になります。Lambda関数にはハードコーディングせずに外部に格納するようにしました。AWSにはSystems Manager パラメータストア
という機能があります。このサービスに取引所のAPIキーやAPIシークレットを格納し、アプリケーション実行時にパラメータを取得しています。
apiKey, err := getParameter("buy-btc-apikey")
if err != nil {
return getErrorResponse(err.Error()), err
}
apiSecret, err := getParameter("buy-btc-apisecret")
if err != nil {
return getErrorResponse(err.Error()), err
}
Event Bridgeによるスケジューリング
Event Bridge
というサービスではCron式を指定して、Lambdaの起動スケジュールを設定できます。 1日に1回、特定の時間にLambdaが起動するように設定しました。
# Udemyで講座を公開しました
こちらのアプリケーションの構築方法をUdemyの講座として公開しています。
暗号資産(仮想通貨)の基礎の解説や環境構築のハンズオン・ライブコーディングがまとまった教材となっております。
プロモーションコード欲しい方は、気軽にご連絡ください!