Ccmmutty logo
Commutty IT
0 pv4 min read

【CloudFormation】リソースポリシーAWS::Lambda::Permissionの使い方

https://cdn.magicode.io/media/notebox/ef2daec7-f33a-4c7a-bffc-bc981e01ff2b.jpeg

はじめに

LambdaをCloudFormationで構築していた際に、
Lambdaのリソースベースポリシー(Lambdaを実行する許可)はどう書くのだろう?となりました。
マネジメントコンソールでいう下記⇩
調べてみるとAWS::Lambda::Permissionを使用して、リソースとして書く必要があることがわかりました。
この記事ではAWS::Lambda::Permissionの使い方を説明します。

AWS::Lambda::Permissionの使い方

概要

まずは、公式ドキュメントで概要を見ていきましょう。
リソースAWS::Lambda::Permissionは、AWS サービスまたは別のアカウントに関数を使用する権限を付与します。関数レベルでポリシーを適用するか、修飾子を指定して単一のバージョンまたはエイリアスへのアクセスを制限することができます。
CloudFormaitonでLambda関数を作成する際は、AWS::Lambda::Permissionリソースを別途記載し、
その中でLambdaのアクセス許可を与えたい対象(AWSサービスやアカウント)を指定する必要があるよということですね。

プロパティ

続いて、AWS::Lambda::Permissionのプロパティを見ていきましょう。
下記がプロパティ一覧です。今回はこの中からいくつか絞って説明します。
Type: AWS::Lambda::Permission
Properties:
  Action: String
  EventSourceToken: String
  FunctionName: String
  FunctionUrlAuthType: String
  Principal: String
  PrincipalOrgID: String
  SourceAccount: String
  SourceArn: String

Actionプロパティ

Lambda関数を実行するAWSサービスやアカウントが実行できるアクションを記載します。例えば下記です。
  1. lambda:InvokeFunction
    Lambda関数を呼び出すアクション。最もよく使用される。API GatewayやS3がLambdaを呼び出す際に使用させる。
  2. lambda:InvokeFunctionUrl
    API GatewayかませずにLambdaのURLを用いて、外部からLambda関数を呼びす際に使用される
  3. lambda:GetFunction
    Lambda関数のメタデータ(ARN、ロール、タイムアウト値、メモリサイズなど)を取得するために使用される

FunctionNameプロパティ

リソースポリシーを設定したLambda関数の名前やARNを指定します。
FunctionName:my-function:v1のようにバージョン番号やエイリアスをつけることも可能です。

Principalプロパティ

Lambda関数を呼び出す際に許可するプリンシパルを指定します。プリンシパルに指定できるのは下記です。
  1. AWSサービス
    Lambda関数を呼び出すことができる他のAWSサービスを指定する。
    • API Gateway: apigateway.amazonaws.com
    • S3: s3.amazonaws.com
    • CloudWatch Events (EventBridge): events.amazonaws.com
      SourceArn、SourceAccountプロパティで、リソースのARNやAWSアカウントを指定することで権限を付与するリソースを制限することができる。
  2. AWSアカウント
    アカウントIDを使用してAWSアカウントをプリンシパルとして指定できる。
  3. IAMユーザーまたはロール
    ARNを指定することで、IAMユーザーやロールをプリンシパルとして指定きる。

具体例

最後にAWS::Lambda::Permissionの具体例を見ていきましょう。

API Gateway からの呼び出しを許可

API GatewayからLambda関数を呼び出すための設定です。
#AWSアカウント123456789のAPIGatewayをプリンシパルに指定し、Lambdaの実行権限を付与する
  MyLambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt MyLambdaFunction.Arn
      Principal: apigateway.amazonaws.com
      SourceAccount: 123456789
# HTTPリクエスト(URLを用いたアクセス)を介したLambda関数の呼び出しを許可する権限を付与する
  MyLambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunctionUrl
      FunctionName: !GetAtt MyLambdaFunction.Arn
      Principal: '*'

終わりに

AWS::Lambda::Permissionの使い方についてまとめました。
今後もAWSを中心に業務で気になった点をまとめていきたいと思います!

Discussion

コメントにはログインが必要です。