はじめに
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サービスやアカウントが実行できるアクションを記載します。例えば下記です。
- lambda:InvokeFunction
Lambda関数を呼び出すアクション。最もよく使用される。API GatewayやS3がLambdaを呼び出す際に使用させる。
- lambda:InvokeFunctionUrl
API GatewayかませずにLambdaのURLを用いて、外部からLambda関数を呼びす際に使用される
- lambda:GetFunction
Lambda関数のメタデータ(ARN、ロール、タイムアウト値、メモリサイズなど)を取得するために使用される
FunctionNameプロパティ
リソースポリシーを設定したLambda関数の名前やARNを指定します。
FunctionName:my-function:v1のようにバージョン番号やエイリアスをつけることも可能です。
Principalプロパティ
Lambda関数を呼び出す際に許可するプリンシパルを指定します。プリンシパルに指定できるのは下記です。
-
AWSサービス
Lambda関数を呼び出すことができる他のAWSサービスを指定する。
- API Gateway: apigateway.amazonaws.com
- S3: s3.amazonaws.com
- CloudWatch Events (EventBridge): events.amazonaws.com
SourceArn、SourceAccountプロパティで、リソースのARNやAWSアカウントを指定することで権限を付与するリソースを制限することができる。
-
AWSアカウント
アカウントIDを使用してAWSアカウントをプリンシパルとして指定できる。
-
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を中心に業務で気になった点をまとめていきたいと思います!