こんにちは。 サーバーワークスの松井です。
今回は、Serverless Framework使ってAWSリソースをコマンドで一発で立ち上げたいけどserverless.ymlの書き方がいまいち公式ドキュメント読んでもわからないという人向けに参考となるサンプルコードを提供したいと思います。
みんな参考にしてくれよな!
※1 今回は、Serverless Frameworkの環境は自分で用意できていることを前提にしています。
※2 極力シンプルにするためにソースコードにすべて説明を載せています。
※3 あくまで書き方の感覚を掴みたいという方への記事です。
以下は、AWS Lambda (以降、単に Lambda)とLambdaにAWSサービスやリソースへの実行権限を付与したIAMロールを作成し、作成したIAMロールをLambdaにアタッチするyamlファイルになります。
serverless.yml
# Serverless Frameworkのプロジェクト名 service: matsui-test # Serverless Frameworkのversion frameworkVersion: "2" provider: # インフラ環境を定義(今回はAWS) name: aws # 言語のversion(今回はpython) runtime: python3.8 # オプション lambdaHashingVersion: 20201221 # dev or prod(今回は開発) stage: dev # どのリージョンを使うかを定義(今回は東京) region: ap-northeast-1 # カスタム変数が定義可能 custom: # 外部ファイルの読み込みも可能 otherfile: # 別途yamlファイルと同じ階層にconf/config_sample.ymlを作成してその場所を指定 config: ${file(./conf/config_sample.yml)} # Lambda関数を作成 functions: # 関数の名前を定義(デフォルトだと実際には、サービス名+環境名+関数の名前で表示される) MatsuiTest: # 環境変数を定義(埋め込むのは良くないので設定ファイルから引用できる) # このファイル内で定義した情報を.でつなげることで入力できる # configファイルの取り出したい変数を指定 environment: ${self:custom.otherfile.config.environment} # lambda_handler名を定義を定義(pythonファイル名xxx.pyの.py以下を指定することでどのファイルのlambda_handlerかを指定できる) handler: matsuitest.lambda_handler # LambdaにアタッチするIAMロールを選択(resourceでRoleの権限は別途定義して作成する) # Serverless Frameworkは、CloudFormationで作成するので!GetAttでIAMロールのARNを取り出せる role: !GetAtt MatsuiTestRole.Arn # 各種サービスを作成する # resources以下はCloudFormationと同じ記法が可能 resources: Resources: # IAMロールの名前を定義 MatsuiTestRole: Type: AWS::IAM::Role # 以下でIAMロールを定義 Properties: # IAMロールの内容を定義 AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Path: / Description: MatsuiTest # IAMポリシーを作成 Policies: # IAMポリシーの名前 - PolicyName: MatsuiTestPolicy # IAMポリシーの内容を定義 PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "sts:AssumeRole" Resource: "*"
conf/config_sample.yml
environment: ARN: 'xxx:xxx:xxx'
matsuitest.py
import os def lambda_handler(event, context): # 環境変数を取得 print("ARN is: " + os.environ["ARN"]) response = { "statusCode": 200, "body": "Go Serverless v1.0! Your function executed successfully!" } return response
ディレクトリ構成
- serverless.yml - conf/ - config_sample.yml - matsuitest.py
あとは、魔法のコマンド serverless deploy -v をポチッとしてみよう! AWSコンソールを見ると自分で書いたAWSリソースが存在してますよ!