View a markdown version of this page

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

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

リソースベースのアクセス許可ポリシーを使用すると、他の AWS アカウント、ユーザー、組織、AWS のサービスに Lambda 関数へのアクセスを許可することができます。リソースベースのポリシーは、1 つ以上のステートメントを含む JSON ドキュメントです。各ステートメントは以下を定義します。

  • Principal: アクセス許可を付与するエンティティ (別の AWS のサービス、IAM ロールまたはユーザー、もしくは別の AWS アカウント)

  • Action: 指定されたプリンシパルに対して許可または拒否する API アクションのリスト

  • Effect: 選択した API アクションの使用をプリンシパルに許可するか拒否するか

  • Resource: ステートメントを適用する Lambda 関数、バージョン、またはエイリアス (ワイルドカード文字を使用して、関数のすべてのバージョンとエイリアスを指定することも可能)

Sid (ステートメント識別子) や Condition (きめ細かなアクセス制御のための論理条件) などのオプション要素を使用することもできます。サポートされているポリシー要素の完全なリストは、AWS Identity and Access Management ユーザーガイド の「IAM JSON ポリシー要素のリファレンス」を参照してください。

Lambda 関数にリソースベースのアクセス許可を追加する

リソースベースのアクセス許可を Lambda 関数に追加するには、次の 2 つの方法があります。

  • 完全な JSON ポリシー – Lambda コンソール、AWS CLI、または PutResourcePolicy API アクションを使用して、完全な JSON ポリシードキュメントを追加します。完全な JSON ポリシーを使用すると、IAM グローバル条件キー の全範囲を使用したり、複数のプリンシパルを持つ複数のステートメントを追加したり、明示的な Deny ステートメントを作成したりできます。JSON リソースベースのポリシーの最大サイズは 20 KB です。

  • 個別のアクセス許可 – コンソールまたは AddPermission API アクションを使用して、単一の Allow ステートメントを追加します。個別のアクセス許可は、限られた条件キー (aws:SourceArn、aws:SourceAccount、aws:PrincipalOrgID) のセットのみをサポートしています。

リソースベースのアクセス許可を関数に追加するときは完全な JSON ポリシーを定義することが推奨されます。完全な JSON ポリシーを作成することで、アクセス許可をより柔軟にかつきめ細かに制御できます。

重要

put-resource-policy を使用すると、リソースの既存のリソースベースポリシーが置き換えられます。リソースに add-permission で定義されたアクセス許可が既にある場合、put-resource-policy はそれを上書きします。変更を行う前に既存のポリシーを取得するには get-resource-policy を使用します。

必要なアクセス許可

PutResourcePolicy、GetResourcePolicy、DeleteResourcePolicy の API アクションを使用するときは、次の IAM アクセス許可が必要です。

API アクション 必要なアクセス許可
PutResourcePolicy lambda:PutResourcePolicy、lambda:AddPermission、および lambda:RemovePermission
GetResourcePolicy lambda:GetResourcePolicy および lambda:GetPolicy
DeleteResourcePolicy lambda:DeleteResourcePolicy および lambda:RemovePermission
Console
完全な JSON リソースベースのポリシーを作成するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. アクセスを許可する関数を選択し、[設定] タブを選択します。

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

  4. [リソースベースのポリシーステートメント] ペインで、[編集] を選択します。このアクションで JSON ポリシーエディタが開きます。

  5. 関数のポリシーにステートメントを追加します。API アクションを選択したり、さまざまなタイプのプリンシパル (サービス、アカウント、IAM ロール) を追加したり、アクセスを制御するための条件キーを追加したりできます。

  6. [保存] を選択します。

関数のリソースベースのポリシーは、[ポリシー] ペインで直接編集することもできます。

AWS CLI
完全な JSON リソースベースのポリシーを追加するには

完全な JSON ポリシーを関数に追加するには、put-resource-policy AWS CLI コマンドを使用します。

次のコマンド例では、ローカルマシン上の、policy.json という名前のファイルで定義されたポリシーを使用して、リソースベースのポリシーを関数に追加します。このファイルを含むディレクトリからコマンドを実行します。resource-arn では、関数のバージョンまたはエイリアスを指定することも、非修飾関数 ARN を使用してポリシーを関数全体に適用することもできます。

aws lambda put-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json
Lambda APIs

完全な JSON アクセス許可ポリシーを関数に追加するには、PutResourcePolicy API アクションを使用します。DeleteResourcePolicy アクションを使用して関数のポリシーを削除したり、GetResourcePolicy アクションを使用して関数に現在アタッチされているポリシーを取得したりすることもできます。

関数のポリシーに個別のアクセス許可を追加するときは、AddPermission API アクションを使用します。

関数のリソースベースのポリシーを表示するには

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

  2. 関数を選択します。

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

  4. [リソースベースのポリシーステートメント] までスクロールして、ポリシーを確認します。

AWS CLI

関数のリソースベースのポリシーを表示するには、get-resource-policy コマンドを使用します。関数の非修飾 ARN を使用するか、バージョンまたはエイリアスを指定することができます。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

get-policy コマンドも使用できます。

aws lambda get-policy \ --function-name my-function \ --output text
Lambda APIs

関数のリソースベースのポリシーを取得するには、GetResourcePolicy API アクションを使用します。関数の非修飾 ARN を使用するか、バージョンまたはエイリアス ARN を指定することができます。

GetPolicy API アクションを使用することもできます。

関数のリソースベースのポリシーを削除する

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

  2. アクセス許可のポリシーを削除する関数を選択します。

  3. [構成] タブを選択し、[アクセス許可] を選択します。

  4. [リソースベースのポリシーステートメント] ペインで、[削除] を選択します。

AWS CLI

関数のポリシーを削除するには、delete-resource-policy コマンドを使用して、ポリシーを削除する関数、バージョン、エイリアスいずれかの ARN を指定します。

aws lambda delete-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

個々のステートメントを削除するには、remove-permission を使用します。

aws lambda remove-permission \ --function-name example \ --statement-id sns
Lambda APIs

関数、関数バージョン、関数エイリアスのいずれかにアタッチされたリソースベースのポリシーを削除するときは、DeleteResourcePolicy API アクションを使用します。

ポリシーから個々のステートメントを削除するときは、RemovePermission API アクションを使用します。

既存のポリシーを更新する

関数の、既存のリソースベースのアクセス許可を更新する際の動作は、使用する方法によって変わってきます。

  • put-resource-policy / PutResourcePolicy – 既存のポリシーをすべて置き換えます。以前に追加された個々のアクセス許可はすべて上書きされます。

  • add-permission / AddPermission – 既存のポリシーにステートメントを追加します。上書きは行われません。put-resource-policy の後に add-permission を呼び出すと、新しいステートメントが既存の JSON ポリシーに追加されます。

put-resource-policy を使用するときに既存のアクセス許可が意図せず上書きされることを防ぐには、先に、関数の既存のポリシーを取得します。get-resource-policy 出力には RevisionId フィールドが含まれます。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

新しいポリシーをアタッチするときは、--revision-id パラメータに RevisionId の値を指定し、最新のバージョンに更新されるようにします。古いリビジョン ID を指定すると、Lambda は関数のポリシーを更新しません。

aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json \ --revision-id a1b2c3d4-5678-90ab-cdef-EXAMPLE11111
注記

AddPermission で作成された既存のリソースベースのポリシーは、変更なしに機能し続けます。新しい PutResourcePolicy API を使用する場合、関数コードの変更は不要です。

セキュリティのベストプラクティス

JSON リソースベースのポリシーを使うと、最小特権のアクセスパターンに従うことができます。明示的な拒否に関する規制要件を満たすこともできます。完全な JSON ポリシーを使用すると、次のことが行えます。

  • 特定のプリンシパルまたは条件をブロックする明示的な Deny ステートメントを作成する。

  • 組織条件 (aws:PrincipalOrgID、aws:PrincipalOrgPaths) を使用して、個々のアカウントを列挙することなく Organizations へのアクセスを制限する。

  • IAM グローバル条件キーの全範囲を使用して、アクセス許可の範囲を特定のソースアカウントまたは ARN に制限する。

リソースベースのポリシーの例

例拒否ステートメントを使用して Amazon S3 にアクセス許可を付与する

次のポリシーは、アカウント内のすべての Amazon S3 バケット (明示的に拒否された 1 つのバケットを除く) に関数を呼び出すアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }, { "Sid": "deny-s3-bucket", "Effect": "Deny", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:111122223333:function:my-function", "arn:aws:lambda:us-east-2:111122223333:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }
例組織内のアカウントにアクセス許可を付与する

次のポリシー例では、組織内のすべての AWS アカウントに対する呼び出しアクセスを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "org-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }
例複数の IAM ロールへのアクセスを条件付きで許可します。

次のポリシーは、2 つの IAM ロールに、指定された IP アドレスから CreateAlias アクションを使用するためのアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-roles", "Effect": "Allow", "Action": "lambda:CreateAlias", "Principal": { "AWS": [ "arn:aws:iam::444455556666:role/role-name", "arn:aws:iam::444455556666:role/role-name2" ] }, "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "IpAddress": { "aws:SourceIp": "192.0.2.0" } } } ] }
例呼び出し元が指定された組織に属している場合を除いて、アクセスを拒否する
{ "Version": "2012-10-17", "Statement": [ { "Sid": "deny-access", "Effect": "Deny", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } }, { "Sid": "allow-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAnyValue:StringLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } } ] }

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

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