Lambda から最新の AWS SDK を使って Aurora のデータベースクラスタの停止、開始を実行できるようにする

Lambda から Aurora のデータベースクラスタを止めるためにRDS.stopDBCluster を呼んだのですが stopDBCluster is not defined になったので Lambda Layers を使って解決してみました。

Amazon Aurora がデータベースクラスタの停止、開始へのサポートを開始

Lambda の実行環境調査

Lambda の実行環境(ランタイム: Node.js 8.10)では AWS SDK for JavaScript – 2.290.0 がデフォルトで含まれており
2.290.0までに対応している API であれば何も考えずに const AWS = require('aws-sdk'); で使うことができます。

docs.aws.amazon.com

2.290.0 は 2018/08/10 にリリースされたバージョンなので、それ以降にリリースされた API に関しては何かしら対策が必要となります。

Release Release v2.290.0 · aws/aws-sdk-js · GitHub

今回欲しいのは、RDS の start/stop DBCluster が入っているバージョンで
CHANGELOG から探してみると2.319.0で入っており、やはりそのままでは使えません。

aws-sdk-js/CHANGELOG.md at master · aws/aws-sdk-js · GitHub

feature: RDS: This launch enables RDS start-db-cluster and stop-db-cluster. Stopping and starting Amazon Aurora clusters helps you manage costs for development and test environments.

Lambda Layers で解決する

今までだと関数のコードと一緒に zip にしてアップしていたのですが、関数の容量が大きくなってしまうため
Re:invent 2018 で発表された Lambda Layers を使ってみます。

詳細な手順は以下の記事にわかりやすく書かれていますが、Python の例なので Node.js の場合の差分のみ記載します。

qiita.com

最新の AWS SDK の場合は以下のコマンドを実行して、できあがった zip をアップロードします。

$ mkdir nodejs && cd nodejs
$ yarn add aws-sdk
$ cd ../
$ zip aws-sdk-nodejs-latest.zip -r nodejs

Layers の作成が完了したら、aws-sdkをインポートすることで実行できるようになります。
※ Layers に aws-sdk が存在する場合は、実行環境のデフォルトのものより優先されてインポートされるようです。

RDS.stopDBClusterが使えるようになった参考コードは以下です。

const AWS = require('aws-sdk');

exports.handler = (e, ctx) => {
    const rds = new AWS.RDS();
    const params = {
        DBClusterIdentifier: CLUSTER_NAME
    };
    rds.stopDBCluster(params, (err, data) => {
        if (err) console.log(err);
        ctx.succeed();
    });
}

まとめ

  • Lambda で AWS SDK for JavaScript – 2.290.0 以降のバージョンを使いたい場合は対策が必要。
  • Lambda Layersを使うと、関数の容量を抑えらる・他の関数でも使い回せる と言ったメリットがある!

参考

docs.aws.amazon.com

dev.classmethod.jp

GameWith Engineer Meetup #1 に参加した

8/21に GameWith Engineer Meetup #1 に参加してきた.

内容は

  • インフラ基盤
  • レガシーコードとの向き合い方
  • ブロックチェーンゲーム開発

の3本立て.
インフラの事例は各社サービスによって特徴があり解決方法に発見があるし, 7月は Solidity を勉強してハッカソンに参加したので, ブロックチェーンゲーム開発にも興味があり日々業務で関わっている方の話が聞けるかなと期待しての参加. Q&Aは記憶に残っているところのみ.

gamewith.connpass.com

GameWithを支えるインフラ基盤 / @serima

www.slideshare.net

Q&A

  • ELBの暖気などスケール対策は何かやっているか?
    -> 恒常的にアクセスがあるため、特段やっていないが問題は起きていない。

  • リクエストの性質は?
    -> GET リクエストでリードアクセスが大半

  • DDoS 対策は?
    -> 特にしてない
    -> CDN は画像にのみ利用

  • リクエスト予測が外れたことはあったか?
    -> 過去にゲームのイベント開始時間がずれたことによるトラブルがあったが、ここ1年はそういったことは起きていない

レガシーコードの中でも迅速にユーザーに価値を届ける / @m3m0r7)

www.slideshare.net

Q&A

  • レビューは完全にランダムで担当割り振っている?
    -> スキルレベル問わず完全なランダム
    -> リリースは QA エンジニアがチェックして問題なければ通す

ブロックチェーンゲーム開発の取り組み / @takepon_phd

speakerdeck.com

Q&A

  • サイドチェーン、プライベートチェーンなどあると思うがなぜ Ethereum ?
    -> コミュニティとの関係性、開発に関する情報や開発者の数が多いため Ethereum を選んだ

その他・まとめ

インスタンス台数の増減の決定を, 過去の数値から算出 + 攻略部の方の経験値で行っていたのが面白かった.
まだ最適化が必要だと話していたが, 人間の意思決定を過去のデータでサポートするこのモデルは高確率で最適な数値を導き出せそうな予感がした.
もちろんオートスケールはあるものの, 突発的なリクエスト変動を事前にある程度予測するには有効な手段だと感じた.

記念すべき第1回!で, これからやっていくぞ感が溢れていた.
参加者は12,3人 + GameWith の方で, 距離が近く質問がしやすく(自分も2,3質問した)参加者の方は色々と持ち帰れたのではないかな.

Slack Slash Command を外部から叩ける slack-cmd を作った

www.npmjs.com

github.com

 使い方

$ npm install -g slack-cmd
特定チャンネルのトピックを更新する.
$ slack-cmd -w xxx -c topic -t "this channel is for developer" -C xxxxx -T xxxx-xxxxxxxxx-xxxx
GtiHub の更新情報が Slack に流れるようにする.

GitHub | Slack App Directory をインストール/設定したあとで

$ slack-cmd -w xxx -c github -t "subscribe owner/repository" -C xxxxx -T xxxx-xxxxxxxxx-xxxx

 作った背景

ChatOps で使うために作った Slack Slash Command たちを外部(ターミナル, CI のプロセス)からでも実行したかった.

Slack の GitHub App が使いにくくて, プログラムからいい感じに叩けるようにしたかった.

その他/学び

  • 引数をハンドリングするのに commander.js が便利と聞いて使ってみたらとても良かった( npm ツール開発の生産性あがる!

github.com

  • "Content-Type": "multipart/form-data" で複数データを指定するには, ヘッダに boundary={boundary} を定義して --{boundary} でデータの区切りを指定する

  • 2本目の npm ツールということで init から publish までスムーズに進められた.

  • 開発にかかった時間: 約4時間

Ethereum dApps をローカル環境で動かす

dApps 開発者ギルド勉強会 #1 に参加して
ローカル環境で dApps をデプロイして動かすことろまでができたので記録を残しておく.

環境構築と Truffle を使って Ganache のローカルチェーンにデプロイするところまでは
オオキマキさん (@ookimaki_JP) のブログの通りにすすめていけば問題なくできると思う. (ありがたい!)

 環境構築

givinglog.com

 Ethereum dApps Quickstart

givinglog.com

Ethereum dApps Quickstart の動作確認

MetaMask は file://~ から始まる URL では動作しないため, live-server を使って確認する.

$ npm install -g live-server
$ cd src/
$ live-server

ブラウザが自動で立ち上がり http://127.0.0.1:8080 が開く.

テキストエリアに文字を入れて, set をクリックで MetaMask が表示されるのでそのまま submit

alert で Txhash: 0xxxxxx と表示されれば成功.

Ganache の Transactions タブでも同じアドレスが確認できるはず.

発生したエラーと対策

npm install でエラー

  async awaitCurrentBlock () {
        ^^^^^^^^^^^^^^^^^

SyntaxError: Unexpected identifier
対策

7.6系以降の Node.js を使用する.
安定版の8.x系を使っておけば安心.

truffle migrate でエラー 

$ truffle migrate
Using network 'development'.

Error: Attempting to run transaction which calls a contract function, but recipient address 0xxxxx is not a contract address
対策
$ truffle migrate --reset

github.com

 Provided address "0xxxxx" is invalid (ブラウザのconsole)

 対策

src/index.htmlcontractAddress が間違っているので, truffle migrate した時のコントラクトアドレスを再度確認して正しいものを指定する.

 contract.methods.set is not a function (ブラウザのconsole)

対策

src/js/contract_abi.js の contractABI が間違っているので,   build/contracts/SimpleStore.json の abi を正しくコピーする.

 MetaMask - RPC Error: Error: Error: [ethjs-rpc] rpc error with payload (ブラウザのconsole)

MetaMask - RPC Error: Error: Error: [ethjs-rpc] rpc error with payload
対策

src/index.htmlcontractAddress が間違っているので, truffle migrate した時のコントラクトアドレスを再度確認して正しいものを指定する.

所感

  • ひとりでやったら1週間ぐらいかかりそうな内容が2時間でできた!
  • わからないことは気軽に聞くことができたり, 一緒に考えながらやっていけたり dApps 開発者ギルドに感謝!

活用のブロックチェーン〜Trust と KyberNetwork で見る Web3.0 の可能性〜 に参加した

cryptocrazies.connpass.com

参加の目的

8 月に参加するハッカソンに向けて Solidity 強化月間と銘打っており
Web3.0 を支えるスマートコントラクト等の技術を理解した後に
どのような世界が作れるのか具体的にイメージして
他の方々がどのように考えているか, キャッチアップしたいと思い参加した.

イントロダクション LT by Steemit Japan Ambassador Sho T @showying_art

speakerdeck.com

  • なぜこの会をやるか?

    • Web 3.0 に可能性を感じている
    • DApps 発散フェーズが来る
    • そうなったときに Truct や KeyberNetwork がさまざまな課題を解決するだろう
  • Steemit を使って価値のルールは作れると感じた

  • どのような切り口で考えると面白くなるか?

    • 行動がトークンに変わる
  • 近々なにが起こるのか?何が課題になるのか?

    • Lawyer 2 の Plasma 等が現実のものになっていくと, DApss が増えまくる
      • DApss ごとのトークンが増える
      • ゴミトークンが増える
  • UX の課題を解決するのが Truct

  • 流動性の課題を解決するのが KeyberNetwork

    • DApps 発散フェーズを支える基盤の視点で考える

Web3.0 の入口となる Trust Wallet について by Trust Wallet Japan Ambassador マキオ @makionaire

speakerdeck.com

  • ブログ: https://makionaire.com/

  • ウォレットはブロックチェーンの入口

  • Trust Wallet

    • Android は OSS としてコードが出てるのは途中まで.
    • Founder: Viktor Radchenko
    • オフィスはスタバ
  • 一番特徴的なのはトークンの画像を自分で作って, コミットするとアプリ内に表示されるようになる

  • Push 通知は中央集権的

    • ウォレットのアドレスと端末の ID が紐付いている
  • KeyberSwap を使うと, 取引所を介さずとも Ether を KBN に変換したりできる

  • Trust SDK

    • DApps のウォレットの実装, 秘密鍵の保持などを Trust に任せることができる
  • Eth2Phone

    • 電話番号だけで Ehter を送ることができる
  • Trust Platform

    • 法律的な壁によって計画は中止
    • もろもろ整ったあとに再始動あるかも?

Web3.0 における KeyberNetwork の役割 by Kyber Network エバンジェリスト hory @Hory_BTV

docs.google.com

  • KeyberNetwork って DEX でしょ?

    • 違うんです。
    • 最初は DEX として認知されていたが, 現在はそうではない
  • なぜ必要?

    • 分断されるエコシステム
  • どうやって解決する?

    • だれでも活用できるトークン交換をエコシステムに提供する
  • 何を創っている?

    • 分散型流動性ネットワーク
    • オープンリザーブアーキテクチャ
    • オンチェーンで、すべてのスマートコントラクトを連携できるように
  • web3.0 って何がいいの?

    • 見える部分と見えない部分を意識する必要がある

      • ビットコインが広まったのはリバタリンの人たちが熱狂的に広めたのが大きかった
      • 経済学者バスティア
      • リバリアニズムが好きな経済学者
        • 良い経済学者は見えないものを見ている
        • 悪い経済学者は見えるものしか見ていない
  • Web3.0 の悪いところばっかり見える

  • Web2.0 の良いところばっかり見える

  • Web3.0 の見えないメリット, Web2.0 の見えないデメリットを考えて/探して/発信していかなければメインストリームの人たちは使ってもらえない.

Q&A

Q.KeyberNetwork の交換できるトークンの基準は?

A.サポートしたトークンだけ.
1つリスティングするごとに, 丁寧にブログを書いたりするから遅い.
今後は承認なしに扱えるようになる計画がある(議論中)

Q.リザーブプールの価格はどう決まるか?

A.Binance など価格が安定しているところから, 価格を取得して中央値を決める.
その中央値を基準にリザーブマネージャーがスプレッドと価格を決める.
一番安いリザーブが取引の対象となるので, 高いと使ってもらない.
リザーブ量を超える 100 Ether とかが来た場合は交換はできない.

所感

  • 基本スタンスとして、この部分は中央集権的ですよということを理解した上で使うことが重要そう
  • トークンとはコミュニティ・エコシステムへの行動・貢献を可視化したものというのが腑に落ちた
  • SBD で支払える美容院に行ってみたい