Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

AWS SAM (Serverless Application Model)に触ってみた

More than 1 year has passed since last update.

AWS SAMとは

  • GitHubページ
  • GitHubのサンプル集
  • Lambdaとその周辺サービスを構築する際に使う仕組みで、これを使うといい感じで構築管理できるらしい。
  • CloudFormationの拡張みたいな感じらしい。
  • sam cliを使うとローカルでも開発できるらしい
  • とりあえず使ってみる

手順

SAM CLIインストール

要Docker

pip install --user aws-sam-cli
sam --version

とりあえず動かしてみる

日時を出力する簡単なLambdaをAWS SAMを使ってデプロイしてみます。

下記ファイルを作成します。

main.py
import logging
import datetime

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
  logger.info("The time is %s", datetime.datetime.now())
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  main:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: main.lambda_handler
      Runtime: python3.6
      CodeUri: .
      MemorySize: 128
      Timeout: 10
      Role: !GetAtt lambdaRole.Arn
  lambdaRole:
    Type: "AWS::IAM::Role"
    Properties:
     AssumeRolePolicyDocument:
        Statement:
        - Action: ['sts:AssumeRole']
          Effect: Allow
          Principal:
            Service: ['lambda.amazonaws.com']
        Version: '2012-10-17'
     Path: /
     Policies:
       - PolicyName: Logging
         PolicyDocument:
           Version: '2012-10-17'
           Statement:
             - 
               Effect: "Allow"
               Resource:
                 - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:*"
               Action:
                 - "logs:CreateLogGroup"
             - 
               Effect: "Allow"
               Resource:
                 - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${AWS::StackName}:*"
               Action:
                 - "logs:CreateLogStream"
                 - "logs:PutLogEvents"

AWSにデプロイする前にローカルで実行してみます。

$ echo '{"key1": "this is key1", "key2": "this is key2", "key3": "this is key3"}' | sam local invoke main
2018-07-11 22:48:24 Mounting /Users/kter/workspace/learning_of_sam/sample1 as /var/task:ro inside runtime container
START RequestId: 70b7d564-94ea-4136-bfa2-05deef1525c7 Version: $LATEST
[INFO]  2018-07-11T13:48:25.539Z        70b7d564-94ea-4136-bfa2-05deef1525c7    The time is 2018-07-11 13:48:25.539234

END RequestId: 70b7d564-94ea-4136-bfa2-05deef1525c7
REPORT RequestId: 70b7d564-94ea-4136-bfa2-05deef1525c7 Duration: 10 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB

null

ここまででローカルでLambdaが動きました。

次にAWSにデプロイするのですが、その前にちょっと説明します。

AWS SAMでは各コンポーネントの設定を記載するtemplate.yamlとLambdaのソースコードであるmain.pyを用意する必要があります (もちろんファイル名は変更できます)。

template.yamlはCloudFormationの形式でLambdaの設定(メモリ量、タイムアウト時間、環境変数等)や他AWSリソースの設定を行います。

最後に実行したsam local invokeコマンドは下記のような書式となります。

$ sam local invoke (ファンクションID)

Lambdaに渡されるパラメータはデフォルトではパラメータは標準入力で、--eventで渡すこともできます。
※ファンクションIDはtemplate.yaml内でのIDです。

最後にAWSにデプロイしてみます。これにはsam packagesam deployを実行する必要があります。
sam packageによって一度CloudFormationファイルが生成され、それがS3バケットに設置されます。
sam deployでS3に設置されたCloudFormationファイルが実行され、デプロイが行われます。

sam package --template-file template.yaml --output-template-file sample1.yaml --s3-bucket (S3バケット名)
sam deploy --template-file sample1.yaml --stack-name sample1 --capabilities CAPABILITY_IAM

これでLambdaがデプロイされました。コードの変更時は再度sam packagesam deployを実行すればCloudFormationによって自動でデプロイされます。

kter
creema
全国のつくり手とつかい手が Web 上で直接作品を売買できる、日本最大級のハンドメイドマーケットプレイス「Creema」の企画、開発、運営するスタートアップです。「本当にいいものが埋もれてしまうことのない、フェアで大規模な新しい経済圏をつくろう」を合言葉に、メンバー一丸となって、たのしくストイックに活動を行っています。
https://www.creema.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away