Serverless FrameworkでLambdaのリソースベースのポリシーを設定

記事タイトルとURLをコピーする

こんにちは!サーバーワークスの松井です。

今回は、Serverless FrameworkでLambdaのリソースベースのポリシーを設定する方法を紹介します。

serverless.yamlで定義するfunctions項目では、リソースベースのポリシーを指定をすることができないので、CloudFormationからfunctionsで作成するLambdaの論理名を指定します。

f:id:swx-matsui:20220407195731p:plain

実装方法

リソースベースのポリシーのCloudFormationでの記載の仕方は以下を参考にします。

AWS::IoT::ProvisioningTemplate - AWS CloudFormation

今回は、AWS IoTに対してアクセスを許可するポリシーを設定します。

serverless.yaml

service: lambda-test
useDotenv: true
variablesResolutionMode: 20210326

frameworkVersion: '2'

provider:
  name: aws
  region: ap-northeast-1
  runtime: python3.9
  stage: ${opt:stage, self:custom.defaultStage}
  versionFunctions: false
  lambdaHashingVersion: 20201221
 
plugins: 
  - serverless-python-requirements
 
custom:
  serviceName: lambda-test
  defaultStage: dev
  pythonRequirements:
    layer: true
 
functions:
  TestSwx:
    name: ${self:custom.serviceName}-${self:provider.stage}-test-swx
    handler: test_swx.handler
    timeout: 900
    memorySize: 256
    role: !GetAtt TestSwxRole.Arn
    layers:
      - Ref: PythonRequirementsLambdaLayer
    disableLogs: true
 
resources:
  Resources:
    ResourceBasePermission:
      Type: AWS::Lambda::Permission
      Properties:
        Action: lambda:InvokeFunction
        FunctionName: !Ref TestSwxLambdaFunction
        Principal: iot.amazonaws.com
        SourceArn: arn:aws:iot:ap-northeast-1:{AWSアカウントID}:provisioningtemplate/test
        SourceAccount: {AWSアカウントID}

設定項目

Action

Lambdaを呼び出すアクションを指定

lambda:InvokeFunction

FunctionName

関数名は、functionsの論理名をCloudFormationの定義名に変換した名前にて参照します。

!Ref TestSwxLambdaFunction

Principal

リソース固有の名前を指定

iot.amazonaws.com

SourceArn

アクセス元のARNを指定

arn:aws:iot:ap-northeast-1:{AWSアカウントID}:provisioningtemplate/test

SourceAccount

AWSアカウントIDを指定

結果

serverless.yamlのデプロイが完了すると、Lambda関数のリソースベースのポリシーに定義したポリシーがアタッチされていることが確認できます。 ステートメントIDは、CloudFormationで指定ができないので自動で割り振られます。

f:id:swx-matsui:20220407195249p:plain

松井 宏司

アプリケーションサービス部

AWS認定11冠

プロレスをこよなく愛する