LoginSignup
0
1

More than 5 years have passed since last update.

AWS SAMでデプロイする RubyでLambda実行

Posted at

AWS samの環境構築 RubyでLambda実行の続き、ローカル環境でsamを使ってWebAPIのサンプルとテストの実行をRubyで行った。今回はデプロイしてAWSの環境で動かす。

Quick Start - AWS Serverless Application Model

Package the Applicationのあたりから

デプロイ用のS3バケットを作成する

デプロイするにはそのままLambdaを展開するのではなくて、一旦s3のバケットにアップロードする必要がある。

> aws s3 mb s3://適当なバケット
make_bucket: 適当なバケット

# lsでバケットを確認してみる
> aws s3 ls
2019-02-XX XX:XX:XX 適当なバケット

心配だったのでAWSのコンソールでも確認してみたところ、バケットが作成されていることも確認した。

パッケージをS3にアップロードする

下記のコマンドを実行するとpackaged artifacts(多分Lambdaのコードとかライブラリも?zipで固めたもの)がs3にアップロードされて、ローカルにはpackaged.yamlが作成された

> sam package \
    --output-template-file packaged.yaml \
    --s3-bucket 適当なバケット

Uploading to 818f0d274293fec4b3580cc9b3a0c6e0  643563 / 643563.0  (100.00%)
Successfully packaged artifacts and wrote output template to file packaged.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /Users/kon_yu/devlopment/sam_sample/sam-app/packaged.yaml --stack-name <YOUR STACK NAME>

packaged.yamlの中身を見るとCloudformationのファイルがある。
HelloWorldFunctionRoleというIAMロールがついている。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'sam-app

  Sample SAM Template for sam-app

  '
Globals:
  Function:
    Timeout: 3
Outputs:
  HelloWorldApi:
    Description: API Gateway endpoint URL for Prod stage for Hello World function
    Value:
      Fn::Sub: https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/
  HelloWorldFunction:
    Description: Hello World Lambda Function ARN
    Value:
      Fn::GetAtt:
      - HelloWorldFunction
      - Arn
  HelloWorldFunctionIamRole:
    Description: Implicit IAM Role created for Hello World function
    Value:
      Fn::GetAtt:
      - HelloWorldFunctionRole
      - Arn
Resources:
  HelloWorldFunction:
    Properties:
      CodeUri: s3://適当なバケット/818f0d274293fec4b3580cc9b3a0c6e0
      Environment:
        Variables:
          PARAM1: VALUE
      Events:
        HelloWorld:
          Properties:
            Method: get
            Path: /hello
          Type: Api
      Handler: app.lambda_handler
      Runtime: ruby2.5
    Type: AWS::Serverless::Function
Transform: AWS::Serverless-2016-10-31

デプロイ

sam deploy \
    --template-file packaged.yaml \
    --stack-name sam-app \
    --capabilities CAPABILITY_IAM \
    --region ap-northeast-1

--template-fileで読み込むcloudformationのテンプレートファイル(packaged.yaml)を指定
--stack-nameでcloudformationのスタック(sam-app)を指定
--capabilities CAPABILITY_IAMをオプションで付けるとIAMロールを作ってくれる。このIAMロールがlambdaの実行ロールに指定される
-- regionで東京リージョンを指定(ap-northeast-1)

動作確認

AWSコンソールからCloudformationを開いて、先ほど作成したsam-appのスタックを選択し下の方にある「出力」のタブを開くと
HelloWorldApiのエンドポイントが値にURLが格納されている。このURLをブラウザで開けば動作確認ができる。

Gemfileで規定したライブラリは、S3にアップロードされた中身は
sam buildでビルドして生成された.aws-sam/build/HelloWorldFunctionの中身のようだった。

Archive:  818f0d274293fec4b3580cc9b3a0c6e0
  inflating: app.rb
  inflating: Gemfile
  inflating: Gemfile.lock
  inflating: .bundle/config
  inflating: vendor/bundle/ruby/2.5.0/specifications/mime-types-3.2.2.gemspec
  inflating: vendor/bundle/ruby/2.5.0/specifications/httparty-0.16.3.gemspec
  inflating: vendor/bundle/ruby/2.5.0/specifications/multi_xml-0.6.0.gemspec
  inflating: vendor/bundle/ruby/2.5.0/cache/mime-types-data-3.2018.0812.gem
  inflating: vendor/bundle/ruby/2.5.0/bin/httparty
  inflating: vendor/bundle/ruby/2.5.0/gems/httparty-0.16.3/cucumber.yml
  inflating: vendor/bundle/ruby/2.5.0/gems/httparty-0.16.3/.rubocop_todo.yml

デプロイされている内容をAWSコンソールから確認

ブラウザを開いてAWSのコンソールから東京リージョンを選ぶ
AWSのコンソールでLambdaを開くと
lambdaが作られたことがわかる。

またCloudformation削除してデプロイし直すとURLが変わるようだ。

例えばこんな感じ
* 1回目のデプロイ: https://hboimeyaht4.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
* 2回目のデプロイ: https://8y2few5qxf.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

今後の課題

  • もう一つ自前でAPI Gatewayのエンドポイントとそれに紐づくLambdaを作成する
  • DynamoDBにデータを挿入する、データ取得するエンドポイントを作る
    • その際にLambda Layersを適用してみる
  • デプロイ時の名前解決の問題

参考情報
本当にLambda Layersで幸せになれるのか? 旧式のデプロイ方式からLambda Layersを活用したデプロイ方式への移行を検討する | DevelopersIO
AWS SAMでAPI Gatewayのリソースポリシーを設定してみた | DevelopersIO

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1