Serverless FrameworkからCloudFormationの出力値(Outputs)を参照する

2019.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

DI部の貞松です。最近はLambda(python3)ばっかり弄ってます。

クラウド上でのサーバーレスな環境構築を容易にするフレームワークの一つとしてServerless Frameworkがあります。

https://serverless.com/

Serverless Frameworkでは、serverless.ymlという構成ファイルを記述してデプロイすることにより、主処理となるLambdaやLambda関数の発火イベント(API Gateway、CloudWatchs Eventなど)、接続する各種リソース(S3やDynamoDBなど)を同時に生成して利用することが出来ます。

概ねServerless Frameworkで完結するケースが多そうですが、既存の環境とServerless Frameworkで作成した環境を連携するケースもあります。 既存環境がCloudFormationを利用して生成されている場合、その出力(Outputs)を参照して、Serverless Frameworkから利用することができます。

https://serverless.com/framework/docs/providers/aws/guide/variables/#reference-cloudformation-outputs

記法としては、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で生成する環境に利用する際には、簡潔に記述することができて変更にも強いのでおすすめです。