Serverless FrameworkとAWS Lambda with RubyでS3アクセス
Serverless Frameworkを触ってみました。
AWS LambdaをCloudWatchからスケジュール起動します。Lambdaでの処理内容はS3にアクセスしてログに残すのみです。処理はRubyで書きます。
追記:PythonやJavaScriptでの例は後日書きました。→ 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