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 |
関数のリソースベースのポリシーを表示するには
関数のリソースベースのポリシーを削除する
既存のポリシーを更新する
関数の、既存のリソースベースのアクセス許可を更新する際の動作は、使用する方法によって変わってきます。
-
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-ida1b2c3d4-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 アクションは、リソースベースのポリシーをサポートしています。
-
InvokeFunctionUrl(アクセス許可のみ)