AWSLambda에서 Ruby Gem을 사용하는 방법

그냥 집단 Advent Calendar 2018 의 7일째의 기사입니다.

Lambda에서 Ruby를 사용할 수있게되었습니다! ! !



Announcing Ruby Support for AWS Lambda | AWS Compute Blog



Gem을 사용하지 않는 경우 AWS Management Console에서 포치포치하여 온라인 편집기에서 람다를 생성할 수 있습니다.
그러나 Gem을 사용하는 경우 로컬에서 패키지를 만든 다음 배포해야합니다.

이쪽의 순서의 일본어로의 설명이 좀처럼 발견되지 않았기 때문에, 만들기로 했습니다.

이 기사에서 다루는 절차는 싹둑 이런 느낌입니다!
  • Slack에게 메시지를 보내는 간단한 루비 응용 프로그램 만들기
  • sam-cli를 사용하여 배포
  • AWS Management Console에서 동작 확인

  • 전제 조건


  • 로컬에 Ruby2.5.0 (다른 버전이기 때문에 동작하지 않는다고 하는 것도 없지만, 2.5.0 사용하고 있으면 안심)
  • aws-cli
  • IAM은 이하의 정책이 필요 (좀 더 좁힐 수가 있을지도 모릅니다만 이번은 샘플용으로 만들었을 뿐이므로 적당합니다 웃음)
  • AWSLambdaFullAccess
  • IAMFullAccess
  • AmazonS3FullAccess
  • Cloudfront의 FullAccess (AWS가 기본적으로 제공하는 정책에는 없으므로 직접 정책을 만들어야 함)

  • sam-cli
  • S3Bucket이 작성되었습니다
  • Slack webhookUrl( 참고 문서 )

  • IAM
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "cloudformation:*",
                "Resource": "*"
            }
        ]
    }
    
  • Slack에게 메시지를 보내는 간단한 루비 애플리케이션 만들기
    이번에는 slack-notifier이라는 Gem을 사용하여 Slack에 알림을 보내는 Lambda를 만듭니다!
  • 
    
    mkdir example_project
    cd example_project
    bundle init
    

    이 명령을 실행 한 후 Gemfile이 생성되므로 여기에 slack-notifier를 추가합시다.

    Gemfile
    
    # frozen_string_literal: true
    
    source "https://rubygems.org"
    
    git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
    
    gem 'slack-notifier' # この一行を追加!
    

    Gemfile에 gem을 추가한 후 bundle install 하면 준비 완료!
    
    $ bundle install
    Fetching gem metadata from https://rubygems.org/..............
    Resolving dependencies...
    Using bundler 1.17.1
    Using slack-notifier 2.3.2
    Bundle complete! 1 Gemfile dependency, 2 gems now installed.
    Use `bundle info [gemname]` to see where a bundled gem is installed.
    
    $ bundle install --deployment
    Fetching gem metadata from https://rubygems.org/..............
    Using bundler 1.17.1
    Fetching slack-notifier 2.3.2
    Installing slack-notifier 2.3.2
    Bundle complete! 1 Gemfile dependency, 2 gems now installed.
    Bundled gems are installed into `./vendor/bundle`
    

    프로젝트의 루트에 Slack에 메시지를 보내는 루비 파일을 만듭니다.

    example.rb
    
    require 'slack-notifier'
    
    # ↓自分んおwebhook urlで置き換え
    webhook_url = "https://hooks.slack.com/services/your/webhook/url"
    
    def test(event:,context:)
      notifier = Slack::Notifier.new webhook_url
      notifier.ping "Hello World"
    end
    

    이번에 쓰는 코드는 이것뿐!

    이 시점에서의 디렉토리 구조는 이런 느낌입니다.
    
    $ tree -L 2 -a
    .
    ├── .bundle
    │   └── config
    ├── .ruby-version
    ├── Gemfile
    ├── Gemfile.lock
    ├── example.rb
    └── vendor
        └── bundle
    

    2. sam-cli를 사용하여 배포



    프로젝트의 루트에 다음 파일을 추가합시다.

    template.yml
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: 'sample ruby application'
    
    Resources:
      ExampleFunction:
        Type: AWS::Serverless::Function
        Properties:
          Handler: example.test
          Runtime: ruby2.5
          Policies:
          Environment:
    
    Outputs:
      ExampleFunction:
        Description: Example Lambda Function ARN
        Value:
          Fn::GetAtt:
          - ExampleFunction
          - Arn
    

    이 템플릿 파일을 기반으로 sam-cli로 배포할 수 있습니다.
    그런 다음 애플리케이션을 패키징하고 S3 Bucket에 저장합니다.
    $ sam package --template-file template.yml  \
                  --s3-bucket <S3Bucket名> \
                  --output-template-file packaged-template.yml
    Uploading to 1a2b3c4d5e6f7gb7df26ff74638ec  32396 / 32396.0  (100.00%)
    Successfully packaged artifacts and wrote output template to file packaged-template.yml.
    Execute the following command to deploy the packaged template
    aws cloudformation deploy --template-file /path/to/example_project/packaged-template.yml --stack-name <YOUR STACK NAME>
    

    마지막으로 출력되는 명령은 무시하고 아래 명령으로 배포합시다!
    stack-name 옵션의 내용은 적절한 이름으로 괜찮습니다.
    $ sam deploy --template-file packaged-template.yml \
                 --stack-name example-stack-name \
                 --capabilities CAPABILITY_IAM
    Waiting for changeset to be created..
    Waiting for stack create/update to complete
    Successfully created/updated stack - example-stack-name
    

    이제 람다 함수를 만들 수있었습니다!

    3. AWS Management Console에서 동작 확인



    Management Console의 Lambda 페이지에 하나의 함수가 추가되어 있어야합니다.



    Lambda 함수가 추가되었음을 확인할 수 있으면 함수 페이지에서 동작을 확인합시다!
    테스트 버튼을 클릭하여 테스트를 만듭니다.



    이벤트 이름을 입력합시다. "key1": "value1" ... 어떤 파괄호의 내용은 이번 불필요하므로 삭제해 괜찮습니다.



    테스트를 실행하고 아래와 같은 화면이 되면 성공입니다!



    Slack에게 메시지가 도착해야합니다.



    주의점


  • 람다의 제약으로, 250MB 이상의 패키지는 업로드 할 수 없습니다.
  • 당연하지만 과금이 발생합니다
  • 좋은 웹페이지 즐겨찾기