gitkadoの気まぐれ日記

島根在住エンジニアが何かに興味を持ったらブログを更新します

aws sam initを試してみた(Ruby)

はじめに

AWS SAMという素晴らしいものがある。
簡単に説明すると、こんな感じです。

  • サーバレス最適化CloudFormation拡張
  • サーバレスアプリケーションのローカル開発
    • Lambdaを作らなくても検証可能
    • AWS上じゃなくても検証可能

サンプルを作る機能(sam init)もあるので、Rubyで試してみます。

開発環境準備

Cloud9使います!最近はここでしか開発してないです。
※ ローカル環境でも問題ないですがSAM入れたりの作業が必要

以下のSAMとRubyはこちらの記事で紹介しているので参考にしていただければ。

gitkado.hatenadiary.jp

SAM

とりあえず最新のaws-sam-cliを入れます。
Cloud9のSAMは古いのでアップグレードする必要があります。

Ruby

LambdaはRuby2.5.0なので合わせます。
Cloud9はRubyのバージョンをダウングレードする必要があります。

sam initを試す (Ruby)

$ sam init --runtime ruby2.5
# 以下のファイルが生成される
├── event.json # lambdaのパラメータ
├── Gemfile # tests用Gem
├── hello_world
│   ├── app.rb # Lambda実行ファイル
│   └── Gemfile # Lambda用Gem
├── README.md # 説明
├── template.yaml # sam template
└── tests
    └── unit
        └── test_handler.rb # テストコード

$ cd sam-app

# Gemをインストールする
$ bundle install

なんと、そのままだと動かないw
一部修正が必要なので修正を行う(正しい修正対応かは自信がない..)

# tests/unit/test_handler.rb
require 'json'
require 'test/unit'
require 'mocha/test_unit'

require_relative '../../hello_world/app'

class HelloWorldTest < Test::Unit::TestCase
  #
  # 割愛
  #
  def expected_result
    {
      statusCode: 200,
      body: {
        message: 'Hello World!',
        # コメントアウト(app.rbのlocationがコメントアウトされてる)
        # location: '1.1.1.1'
      }.to_json
    }
  end

  def test_lambda_handler
    # コメントアウト(不要処理)
    # HTTParty.expects(:get).with('http://checkip.amazonaws.com/').returns(mock_response)
    assert_equal(lambda_handler(event: event, context: ''), expected_result)
  end
end

あとはテスト実行して、Lambda実行してAPIサーバ起動

# テスト実行(100% passedになることを確認)
$ ruby tests/unit/test_handler.rb

# Lambda実行(HelloWorldFuntion)
$ sam local invoke HelloWorldFunction --event event.json

# APIサーバ起動
$ sam local start-api
$ curl 127.0.0.1:3000/hello

まとめ

実運用とかでは使う事ないかな。という感想
samが分からないという状態ならイメージが掴めてGood!
samの話じゃないけど、cloud9がやはり神サービスですわ。

参考サイト

AWS samの環境構築 RubyでLambda実行