Rails経由でAWS Lambda(ruby)を使いファイルをs3にアップロードする方法

タイトルが渋滞していますが、、やったことは下記のこと。

  1. Railsが非同期ジョブ走らせる
  2. 非同期ジョブはlambdaをinvokeする
  3. lambdaがcurlでファイルを持ってきて、s3にアップロードする
  4. その結果のアップロード先URLをRailsのDBに保存

AWS Lambdaを触ったのは初めてです。nodeではなくrubyで動かします。まずは、AWS上にLambda関数を作ります。今回は、コードは短いだろうと予想し、ローカルにインストールせずにAWSのWEB UIのエディタを使いました。

Role 追加

登場ロールは2つ、Rails側でlambdaをinvokeするロールとlambda関数を走らせるロール

Rails側でlambdaをinvokeするロール

*全部必要ではないかもしれませんが、面倒なので全て権限をあげました。

lambda関数を走らせるロール

Rails側のコード

AWS Ruby SDK version2 です。RequestResponseだと同期で処理します。返り値を拾うためにもここは同期で処理。invoke_copy自体を非同期で走らせるイメージです。

Lambda関数のコード

AWS Ruby SDK version3です。Lambdaの/tmpのみがwritableな場所で、maxで512MBです。
したがって、これ以上コピーできません。

[Rails][JQuery]いつも忘れるDynamic select options

結構な頻度で書く依存型セレクトボックス。毎回自力で書いてるような気がするのでログしておく。

ruby/railsでEBS volumeを作る方法

AWS version3でebs volumeを作るのはドキュメント通り。

RubyでAWS Route53にレコードを追加/削除する方法

Aws ruby version3 での話です。CLIはjsonを作らないといけなそうですが、rubyだとそこが必要ないので楽。UPSERTはドキュメントによると無ければCREATE、あればUPDATEとのこと。
またactionにDELETEを指定することでレコードを削除できる。

[Rails] Action Cableの実装方法

JQueryは古いテクノロジーとはいえ、さくっと動くものを作るときは異常に簡単です。
古いテクノロジーは悪ではなく適材適所で使っていくのが大事だと思っています。

まずは、最初からあるapp/assets/javascripts/cable.jsを該当layoutで読み込みます。

全部のViewでApp.cableを呼ぶ必要はないのでcontent_forでActionCableとの通信をとるViewだけJSを走らせるようにします。

JSでは、App.cableにイベントを登録していきます。 引数のchannelにはクラス名、引数を渡すとparamsに入ってサーバ側で処理できます。this.performを使ってクラス内のメソッドを呼ぶことができます。development環境では別プロセスで動作確認ができないのでsetTimeoutを用いてテストしています。

HTML部分は下記のような感じ。

で最後になりますが、ActionCableを継承したクラスです。subscribedがconnectionとともに走ります。 stream_for MODELでモデルに関係したチャネルが接続されます。 そして、broadcast_to(MODEL, object)でそのモデルへの接続を確率したチャネルにプッシュすることができます。

これでダイナミックにDOMを操作できるようになりました。

[Rails] Device利用時のconnection.rb(Action Cable)

Railsガイドで説明されているconnection.rbはcookieを利用しているもので、deviseを利用する場合は、request.envに設定されているwardenのものを取ってくる必要がある。 もしくはsessionの中を漁る感じ、request.envの方が綺麗に書けるのでこちらを採用した。 (Essentially, the both are cookie tho..)

参考: https://stackoverflow.com/questions/38470463/rails-devise-action-cable

AWS Ruby SDKでCost Exploreの情報を取得する方法

aws-sdk version3での話です。

1. aws-sdkのCost Exploreのモジュールを読み込む

2. IAMユーザに請求情報のアクセス権を与える

上部のナビバーのアカウントをクリックして、請求情報のアクセスのeditをクリックしてIAMアクセスのアクティブ化をチェックして保存。

3. IAMユーザに必要なロールを設定して追加する

下記のロールを作成し(今回はGEtCostAndUsageのみ)、該当ユーザでロールを追加する

4. REPLでテスト

Rails cでコンソールを呼び出しテスト。各キーは設定済みとする。

初期化。us-east-1でのみ提供されている

BlendedCostとUnblendedCostの差がわかりづらい。Unblendedの方が割引などを除いた実際の数値に近いという理解で良いのか。

ドキュメントを読み試行錯誤の結果、タグに紐づいたコストを引くことができた。

注意

Cost ExploreのAPIリクエストにはお金がかかりそう。。

vim-session プラグインを使ってtabごとsessionを保存する方法

tmuxで指定したwindow/paneから始める方法 [再起動も安心]を説明したが、Vimのセッション情報もタブを含めてRestoreしたい。 最初は全て自動で保存しようとしたが、必要に応じて自分でセッションを保存した方が実用的。ブラウザのタブのように、使わないタブが残ってしまい必要のないタブが溜まっていってしまう。

vimはデフォルトでセッションの管理が可能だが、細かいところまで残すにはvim-sessionを使った方が良い。

.vimrc

SaveSessionとタイプするのが面倒なのでノーマルモードで\ssでSaveSessionを呼び出す。

例えば、セッションをProject毎に保存する場合は、引数のセッション名にプロジェクト名を指定することでプロジェクトごとのセッションの作成が可能。

.vim/sessions/<session name>.vimに保存されるのでこれをvimの引数として呼び出せばよい。

実際は、tmuxの起動スクリプトに書いておけば良い。

[Cloud IDE] Codenvy ファーストインプレッション

redhatが買収したCodenvyです。Eclipse Cheを利用したIDEでEcliseユーザに馴染み深いものになっているのではないでしょうか。

一言でまとめるなら、”2018年だったらCodenvy使うよね”という感じです。程よくインフラが抽象化されていて開発環境を提供するという目的に則していると思います。

スクショで見ていきます。

Socialボタンによるサインアップ・ログインを完備

Email/passだけではなく、githubログインなどがあるのは良いですね。

今回はgithubログインを選択。ユーザデータ、sshキー、レポジトリへのアクセスが取られます。githubを利用した開発フローならば後で必要になると思うので許可します。

プロフィールを設定してサインアップ終了

3GのRAMが無料で使える!

太っ腹ですね。

Workspace毎にVMが立ち上がる

Cloud9などのサービスだと開発するサーバを意識して作らないといけませんが、workspaceという名前になっていてサーバ側を意識しない環境になっています。

ワークスペースの設置でどの開発環境で行うか選べる。

Herokuみたいに環境をぽちぽち選べる。これはすごい。Railsもありました。

選べるstack。

Dockerによる開発環境提供

作成するとdockerのイメージが立ち上がる。30秒ぐらいで立ち上がります。

開発環境はUbuntu

4Gストレージ付き

10分使用しないと停止設定

おそらくこれが課金ポイントでしょう。10分なんてロジックを考えてたり、同僚とdiscussionしてたら過ぎてしまいますしね。それ毎に30秒待つの苦しい。

Projectを作って開始

残念なのはRailsのプロジェクトがない。。Eclipse開発系多めという印象でしょうか。

まとめ

  • クレジットカードを入れることなく始められる
  • 3GRAMまで無料で利用できる(2018年8月時点)
  • 環境設定を一からやる必要のないStackという概念
  • インフラ(サーバー)を意識しない設計
  • Eclipse好きな人には良さそう
Scroll to top