Serverless FrameworkとAWS Lambda with RubyでS3アクセス

Serverless Frameworkを触ってみました。

AWS LambdaをCloudWatchからスケジュール起動します。Lambdaでの処理内容はS3にアクセスしてログに残すのみです。処理はRubyで書きます。

追記:PythonJavaScriptでの例は後日書きました。→ Serverless FrameworkとAWS Lambda with Python or Node.jsでS3アクセス

Serverless Frameworkをインストール

Serverless Frameworkをインストールします。前提として、npmはインストール済みとします。

$ sudo npm install -g serverless

$ serverless --version
Framework Core: 2.16.1
Plugin: 4.3.0
SDK: 2.3.2
Components: 3.4.3

カレントディレクトリにひな型作成

$ serverless create --template aws-ruby
Serverless: Generating boilerplate...
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v2.16.1
 -------'

Serverless: Successfully generated boilerplate for template: "aws-ruby"
Serverless: NOTE: Please update the "service" property in serverless.yml with your service name

3つのファイルが生成されました。

.gitignore
handler.rb
serverless.yml

ソースコード

serverless.yml は以下の内容にします。

service: sample

frameworkVersion: '2'

provider:
  name: aws
  runtime: ruby2.7
  region: ap-northeast-1
  iamManagedPolicies:
    - arn:aws:iam::aws:policy/AmazonS3FullAccess

functions:
  hello:
    handler: handler.hello
    events:
      # AWS CloudWatchのスケジュール設定
      - schedule: cron(*/2 * * * ? *)
    environment:
      # Ruby実行時の環境変数の設定
      S3_BUCKET: ...
      S3_KEY: ...

regionを書かないとデフォルトの us-east-1 になります。普段 ap-northeast-1 ばかり使っている人からすると、デプロイしたのにデプロイしたものがAWSマネジメントコンソールで見当たらない、ということにハマります。

handler.rb は以下の通りです。S3からテキストファイルを読み込んで標準出力しています。標準出力の内容はCloudWatch Logsに書き出されます。

require 'aws-sdk'

# 環境変数取得
$s3_bucket = ENV["S3_BUCKET"]
$s3_key = ENV["S3_KEY"]

def hello(event:, context:)
  res = readS3Object
  puts(res)
end

def readS3Object
  s3_client = Aws::S3::Client.new
  res = s3_client.get_object({
    bucket: $s3_bucket,
    key: $s3_key,
  })
  res.body.read
end

デプロイ

$ serverless deploy -v

serverless.yml に書いたスケジュールが過ぎると、CloudWatch Logsに実行されたログが残っていることを確認できます。

デプロイ先AWS環境を指定したい場合は --aws-profile オプションを使います。

$ serverless --aws-profile PROFILE_NAME deploy -v

または serverless.yml にプロファイル名を記載することもできます。

provider:
  profile: PROFILE_NAME
  ...

デプロイで作成されたAWSリソースをすべて削除するには以下のコマンドです。

$ serverless remove

または

$ serverless --aws-profile PROFILE_NAME remove