Serverless FrameworkからCloudFormationの出力値(Outputs)を参照する
DI部の貞松です。最近はLambda(python3)ばっかり弄ってます。
クラウド上でのサーバーレスな環境構築を容易にするフレームワークの一つとしてServerless Frameworkがあります。
Serverless Frameworkでは、serverless.ymlという構成ファイルを記述してデプロイすることにより、主処理となるLambdaやLambda関数の発火イベント(API Gateway、CloudWatchs Eventなど)、接続する各種リソース(S3やDynamoDBなど)を同時に生成して利用することが出来ます。
概ねServerless Frameworkで完結するケースが多そうですが、既存の環境とServerless Frameworkで作成した環境を連携するケースもあります。 既存環境がCloudFormationを利用して生成されている場合、その出力(Outputs)を参照して、Serverless Frameworkから利用することができます。
記法としては、cf:[スタック名].[出力のキー]
と書くだけでOKです。
例えば、CloudFormationスタックで生成されたS3バケットがあるとして、スタック実行時にバケット名を出力しているものとします。
serverless.ymlで上記の出力を参照して環境変数にセットするように記述します。
service: ref_outputs_from_cf provider: name: aws region: ap-northeast-1 runtime: python3.7 environment: S3_BUCKET_NAME: ${cf:cm-sadamatsu-cf-sample.BucketName} functions: hello: handler: handler.hello
sls deploy
を実行してデプロイします。
デプロイされたLambdaの画面を確認すると、環境変数にバケット名がセットされていることを確認できます。
後はLambda関数で環境変数を参照することで、該当のS3バケットを指定して操作することができます。
他にもCloudFormationの出力に生成したVPCのサブネットIDやセキュリティグループIDなどを含めることで、serverless.ymlからそれらを参照して、同一VPC内にLambdaを配置するといった構成も可能です。
service: ref_outputs_from_cf provider: name: aws region: ap-northeast-1 runtime: python3.7 environment: VPC_SECURITY_GROUP: ${cf:CreateVpc.SecurityGroupId} VPC_SUBNET: ${cf:CreateVpc.SubnetId} vpc: securityGroupIds: - ${self:provider.environment.VPC_SECURITY_GROUP} subnetIds: - ${self:provider.environment.VPC_SUBNET} functions: hello: handler: handler.hello
既存の環境をServerless Frameworkで生成する環境に利用する際には、簡潔に記述することができて変更にも強いのでおすすめです。