Lambda でのリソースベースのポリシーの使用 - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda でのリソースベースのポリシーの使用

Lambda では、Lambda 関数およびレイヤーのための、リソースベースのアクセス許可ポリシーをサポートしています。リソースベースのポリシーを使用すれば、リソースごとに他の AWS アカウントまたは組織に使用許可を付与できます。また、リソースベースのポリシーでは、お客様に代わって関数を呼び出すことを AWS のサービスに許可することもできます。

Lambda 関数では、関数の呼び出しまたは管理を行うアクセス許可をアカウントに付与することができます。1 つのリソースベースのポリシーを使用して、アクセス許可を AWS Organizations の組織全体に付与することもできます。リソースベースのポリシーを使用して、アカウントのアクティビティに応じて関数を呼び出す AWS のサービスに対する呼び出しアクセス許可を付与することもできます。

関数のリソースベースのポリシーを表示するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [設定] を選択して、[アクセス許可] を選択します。

  4. [リソースベースのポリシー] まで下にスクロールし、[View policy document (ポリシードキュメントの表示)] を選択します。リソースベースのポリシーには、別のアカウントまたは AWS のサービスが関数にアクセスしようとしたときに適用されるアクセス許可が表示されます。次の例は、アカウント 123456789012my-bucket という名前のバケットに対して my-function という名前の関数を呼び出すことを Amazon S3 に許可するステートメントを示しています。

    例 リソースベースのポリシー
    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-s3-my-function", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" }, "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }

Lambda レイヤーでは、レイヤー全体ではなく特定のレイヤーバージョンにのみ、リソースベースのポリシーを使用できます。1 つのアカウントまたは複数のアカウントにアクセス許可を付与するポリシーに加えて、レイヤーでは 1 つの組織のすべてのアカウントにアクセス許可を付与することもできます。

注記

AddPermission および AddLayerVersionPermission API アクションの範囲内の Lambda リソースのリソースベースのポリシーのみを更新できます。現在、Lambda リソースのポリシーを JSON で作成したり、それらのアクションのパラメータにマッピングされていない条件を使用したりすることはできません。

リソースベースのポリシーは、1 つの関数、バージョン、エイリアス、レイヤーバージョンに適用されます。また、1 つ以上のサービスやアカウントにアクセス許可を付与します。複数のリソースにアクセスする、またはリソースベースのポリシーでサポートされていない API アクションを使用する、信頼されたアカウントの場合は、クロスアカウントロールを使用できます。

サポートされている API アクション

次の Lambda API アクションは、リソースベースのポリシーをサポートしています。

AWS のサービスへのアクセス権を関数に付与する

AWS のサービスを使用して関数を呼び出す場合は、リソースベースのポリシーのステートメントでアクセス許可を付与します。このステートメントを、呼び出しまたは管理する関数全体に適用するか、1 つのバージョンまたはエイリアスに制限することができます。

注記

Lambda コンソールで関数にトリガーを追加すると、サービスでその関数を呼び出せるように、関数のリソースベースのポリシーがコンソールで更新されます。Lambda コンソールで使用できない他のアカウントやサービスにアクセス許可を付与するには、AWS CLI を使用します。

add-permission コマンドを使用してステートメントを追加します。最もシンプルなリソースベースのポリシーのステートメントでは、サービスで関数を呼び出すことができます。次のコマンドでは、my-function という名前の関数を呼び出すためのアクセス許可を Amazon SNS に付与します。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text

次のような出力が表示されます。

{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

これにより、Amazon SNS は関数の lambda:Invoke API を呼び出すことができますが、呼び出しをトリガーする Amazon SNS トピックは制限されません。関数が特定のリソースからのみ呼び出せるようにするには、source-arn オプションでリソースの Amazon リソースネーム (ARN) を指定します。次のコマンドは、Amazon SNS に、my-topic という名前のトピックをサブスクリプションするための、関数を呼び出すことのみ許可します。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \ --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

一部のサービスでは、他のアカウントで関数を呼び出すことができます。アカウント ID を含むソース ARN を指定した場合は問題ではありません。ただし、Amazon S3 では、ソースは、ARN にアカウント ID が含まれないバケットになります。バケットを削除すると、別のアカウントで同じ名前のバケットが作成される可能性があります。アカウントのリソースでのみ関数を呼び出せるように、アカウント ID を指定して source-account オプションを使用します。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id s3-account \ --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket-123456 --source-account 123456789012

関数へのアクセス権を組織に付与する

AWS Organizations の組織にアクセス許可を付与するには、組織 ID を principal-org-id として指定します。次のコマンド AddPermission AWS CLI によって、o-a1b2c3d4e5f の組織内のすべてのユーザーに呼び出しアクセス許可が付与されます。

aws lambda add-permission --function-name example \ --statement-id PrincipalOrgIDExample --action lambda:InvokeFunction \ --principal * --principal-org-id o-a1b2c3d4e5f
注記

このコマンドでは、Principal* です。これにより、組織 o-a1b2c3d4e5f 内のすべてのユーザーが関数呼び出しアクセス許可を取得します。Principal として AWS アカウントまたはロールを指定した場合、そのプリンシパルだけが関数呼び出しアクセス許可を取得します。ただし、それらが o-a1b2c3d4e5f 組織の一部である場合に限ります。

このコマンドで、次のようなリソースベースのポリシーが作成されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalOrgIDExample", "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:example", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }

詳細については、「 AWS Identity and Access Managementユーザーガイド」の「aws:PrincipalOrgID」を参照してください。

他のアカウントへのアクセス権を関数に付与する

別の AWS アカウントへのアクセス許可を付与するには、アカウント ID を principal として指定します。次の例では、111122223333 エイリアスを使用して my-function を呼び出すアクセス許可をアカウント prod に付与します。

aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 111122223333 --output text

次のような出力が表示されます。

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

リソースベースのポリシーは、他のアカウントに対して関数へのアクセス許可を付与しますが、そのアカウントのユーザーに対してはユーザーに付与済みのアクセス許可を超える許可を付与しません。他のアカウントのユーザーが Lambda API を使用するには、対応するユーザー権限が必要です。

別のアカウントのユーザーまたはロールへのアクセスを制限するには、ID の完全な ARN をプリンシパルとして指定します。例えば、arn:aws:iam::123456789012:user/developer と指定します。

エイリアスでは、他のアカウントが呼び出すことができるバージョンを制限します。この方法では、他のアカウントは、エイリアスを関数 ARN を含める必要があります。

aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out

次のような出力が表示されます。

{ "StatusCode": 200, "ExecutedVersion": "1" }

その後、関数の所有者は、新しいバージョンを参照するようにエイリアスを更新できます。これにより、呼び出し元で関数を呼び出す方法を変更する必要がなくなります。また、他のアカウントは、新しいバージョンを使用するようにコードを変更する必要もなくなります。エイリアスに関連付けられた関数のバージョンを呼び出すアクセス許可が付与されるだけです。

既存の関数で動作するほとんどの API アクションにクロスアカウントアクセスを付与できます。例えば、アカウントによるエイリアスのリストの取得を許可する lambda:ListAliases、または関数コードのダウンロードを許可する lambda:GetFunction へのアクセス権を付与することができます。各アクセス許可を個別に追加するか、lambda:* を使用して、指定された関数のすべてのアクションに対するアクセス権を付与します。

他のアカウントに複数の関数に対するアクセス許可、または関数で実行しないアクションに対するアクセス許可を付与するには、IAM ロールを使用することをお勧めします。

他のアカウントへのアクセス権をレイヤーに付与する

レイヤーの使用に関するアクセス許可を別のアカウントに付与するには、add-layer-version-permission コマンドを使用して、ステートメントをレイヤーバージョンのアクセス許可ポリシーに追加します。アクセス許可は、各ステートメントで、1 つのアカウント、すべてのアカウント、または組織に付与することができます。

以下の例では、アカウント 111122223333 に bash-runtime レイヤーのバージョン 2 へのアクセス許可を付与します。

aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

次のような出力が表示されます。

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

アクセス許可は、単一レイヤーバージョンにのみ適用されます。新しいレイヤーバージョンを作成するたびに、このプロセスを繰り返します。

組織内のすべてのアカウントにアクセス許可を付与するには、organization-id オプションを使用します。以下の例では、バージョン 3 のレイヤーを使用するアクセス許可を、組織のすべてのアカウントに付与します。

aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text

次のような出力が表示されます。

b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

アクセス許可をすべての AWS アカウントに付与するには、プリンシパルに * を使用して、組織 ID を除外します。複数のアカウントまたは組織が対象の場合は、複数のステートメントを追加する必要があります。

リソースベースのポリシーのクリーンアップ

関数のリソースベースのポリシーを表示するには、get-policy コマンドを使用します。

aws lambda get-policy --function-name my-function --output text

次のような出力が表示されます。

{"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

バージョンおよびエイリアスでは、バージョン番号またはエイリアスを関数名に追加します。

aws lambda get-policy --function-name my-function:PROD

関数からアクセス許可を削除するには、remove-permission を使用します。

aws lambda remove-permission --function-name example --statement-id sns

レイヤーでのアクセス許可を表示するには、get-layer-version-policy コマンドを使用します。

aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text

次のような出力が表示されます。

b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

remove-layer-version-permission を使用して、ポリシーからステートメントを削除します。

aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org