こんにちは!サーバーワークスの松井です。
今回は、Serverless FrameworkでLambdaのリソースベースのポリシーを設定する方法を紹介します。
serverless.yamlで定義するfunctions項目では、リソースベースのポリシーを指定をすることができないので、CloudFormationからfunctionsで作成するLambdaの論理名を指定します。
実装方法
リソースベースのポリシーの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で指定ができないので自動で割り振られます。
松井 宏司
エンタープライズクラウド部
2022 2023 2024Japan AWS All Certifications Engineer
プロレス観戦が趣味