メニュー
AWS Lambda
開発者ガイド

AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー)

Lambda 関数は、AWS Lambda のリソースの 1 つです。Lambda 関数に関連付けられるポリシーに権限を追加できます。Lambda 関数に添付されたアクセス権限ポリシーは、リソースベースのポリシー (または Lambda の Lambda 関数ポリシー) と呼ばれます。Lambda 関数ポリシーを使用して、Lambda 関数の呼び出し権限を管理できます (「Invoke」を参照)。

重要

リソースベースのポリシーを作成する前に、AWS Lambda リソースへのアクセスを管理するための基本概念と使用可能なオプションについて説明する概要トピックをお読みになることをお勧めします。詳細については、「AWS Lambda リソースへのアクセス権限の管理の概要」を参照してください。

Lambda 機能ポリシーは基本的に、AWS Lambda にイベントソースをセットアップして、サービスまたはイベントソースに対して Lambda 関数を呼び出すアクセス権限を付与する場合に使用します (「Invoke」を参照)。例外はイベントソース (たとえば Amazon DynamoDB や Kinesis) がプルモデルを使用している場合で、アクセス権限は Lambda 関数の例外ロールで管理されます。詳細については、「イベントソースマッピング」を参照してください。

Lambda 関数ポリシーにより、Lambda 関数を呼び出すクロスアカウント権限の付与も簡単になります。Lambda 関数を呼び出すクロスアカウント権限 (たとえば、Amazon S3 へのアクセス権限) を付与するとします。IAM ロールを作成してクロスアカウント権限を付与する代わりに、Lambda 関数ポリシーに関連アクセス権限を追加できます。

注記

カスタムアプリケーションとそれが呼び出す Lambda 関数が同じ AWS アカウントに属している場合は、Lambda 関数に添付されたポリシーを使用して明示的にアクセス権限を付与する必要はありません。

AWS Lambda では、Lambda 関数に関連するアクセス権限ポリシーを管理する以下の API オペレーションを提供しています。

注記

AWS Lambda コンソールは、イベントソースと、その Lambda 関数ポリシーのアクセス権限を管理する最も簡単な方法です。イベントのソースの AWS サービスコンソールがイベントソースマッピングの設定をサポートしている場合は、そのコンソールを使用することもできます。新しいイベントソースを設定するか、既存のイベントソースを変更すると、コンソールが自動的に Lambda 関数に関連付けられているアクセス権限ポリシーを変更します。

コンソールを使用して関数ポリシーを表示するには、関数の詳細ページで [Triggers] タブを選択し、次に [View function policy] を選択します。コンソールは、関数ポリシーのアクセス権限を直接変更する機能はサポートしていません。AWS CLI または AWS SDK を使用する必要があります。以下は、このトピックの前半でリスト API オペレーションの AWS CLI の例です。

例 1: Amazon S3 に Lambda 関数の呼び出しを許可する

Amazon S3 に Lambda 関数を呼び出す権限を付与するには、次のようにアクセス権限を設定します。

  • s3.amazonaws.comprincipal 値に指定します。

  • アクセス権限を付与する action として lambda:InvokeFunction を指定します。

イベントが特定の AWS アカウントが所有する特定のバケットから生成されるようにするには、次を指定します。

  • source-arn 値としてバケット ARN を指定し、特定のバケットからのイベントを制限します。

  • バケットを所有する AWS アカウント ID を指定し、指定されたバケット名がそのアカウントに所有されていることを確認します。

以下 AWS CLI コマンドの例では、helloworld Lambda 関数ポリシーに権限を追加して、Amazon S3 に関数を呼び出すアクセス権限を付与します。

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 1 \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::examplebucket \ --source-account 111111111111 \ --profile adminuser

例では、adminuser (フルアクセス権限あり) がこのアクセス権限を追加しています。したがって、--profile パラメーターは adminuser プロファイルを指定します。

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

Copy
{ "Statement": "{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"111111111111\"}, \"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::examplebucket\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:111111111111:function:helloworld\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"}, \"Sid\":\"1\"}" }

プッシュモデルについては、「イベントソースマッピング」を参照してください。

例 2: Amazon API Gateway に Lambda 関数の呼び出しを許可する

Lambda 関数を呼び出すために Amazon API Gateway にアクセス権限を付与するには、以下の作業を行います。

  • apigateway.amazonaws.comprincipal 値に指定します。

  • アクセス権限を付与するアクションとして「lambda:InvokeFunction」を指定します。

  • source-arn 値として API ゲートウェイ エンドポイント ARN を指定します。

以下 AWS CLI コマンドの例では、helloworld Lambda 関数ポリシーに権限を追加して、API ゲートウェイ に関数を呼び出すアクセス権限を付与します。

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 5 \ --principal apigateway.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:execute-api:region:account-id:api-id/stage/method/resource-path \ --profile adminuser

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

Copy
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:apigateway:us-east-1::my-api-id:/test/petstorewalkthrough/pets\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"apigateway.amazonaws.com\"}, \"Sid\":\"5\"}" }

例 3: 別の AWS アカウントによって作成されたユーザーアプリケーションに Lambda 関数の呼び出しを許可する (クロスアカウントのシナリオ)

他の AWS アカウントにアクセス権限を付与する (つまり、クロスアカウントのシナリオを作成する) には、次の AWS CLI コマンドに示すように、principal 値として AWS アカウント ID を指定します。

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 3 \ --principal 111111111111 \ --action lambda:InvokeFunction \ --profile adminuser

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

Copy
{ "Statement": "{\"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"account-id\"}, \"Sid\":\"3\"}" }

例 4: Lambda 関数ポリシーを取得する

Lambda 関数ポリシーを取得するには、get-policy コマンドを使用します。

Copy
aws lambda get-policy \ --function-name example \ --profile adminuser

例 5: Lambda 関数ポリシーからアクセス権限を削除する

Lambda 関数ポリシーからアクセス権限を削除するには、remove-permission コマンドを使用して、関数名とステートメント ID を指定します。

Copy
aws lambda remove-permission \ --function-name example \ --statement-id 1 \ --profile adminuser

例 6: Lambda 関数のバージョニング、エイリアス、アクセス権限を使用する

Lambda 関数のバージョンとエイリアスに対するアクセス権限ポリシーの詳細については、「バージョニング、エイリアス、リソースポリシー」を参照してください。