Lambda 関数へのアクセス権を AWS のサービスに付与する
AWS のサービスを使用して関数を呼び出す場合は、リソースベースのポリシーのステートメントでアクセス許可を付与します。このステートメントを、関数全体に適用することも、単一のバージョンまたはエイリアスに制限することもできます。
注記
Lambda コンソールで関数にトリガーを追加すると、サービスでその関数を呼び出せるように、関数のリソースベースのポリシーがコンソールで更新されます。Lambda コンソールで使用できない他のアカウントやサービスにアクセス許可を付与するには、AWS CLI を使用します。
JSON ポリシーをすべて拒否するときは put-resource-policy を使用することが推奨されます。put-resource-policy を使うと、拒否ステートメントを追加し、IAM 条件キーの全範囲を使用して、1 つのドキュメントですべてのアクセス許可を管理することができます。シンプルなユースケースでは、add-permission を使用して個々のステートメントを追加することもできます。
重要
put-resource-policy を使用すると、リソースの既存のリソースベースポリシーが置き換えられます。リソースに add-permission で定義されたアクセス許可が既にある場合、put-resource-policy はそれを上書きします。変更を行う前に既存のポリシーを取得するには get-resource-policy を使用します。
完全な JSON ポリシーを使う (推奨)
次のポリシー例では、Amazon Simple Notification Service に my-function という名前の関数を呼び出すためのアクセス許可を付与しますが、許可されるのは特定のトピックに対してだけです。また、特定のトピックからの呼び出しも拒否します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-sns-my-topic", "Effect": "Allow", "Principal": { "Service": "sns.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:my-topic" } } }, { "Sid": "deny-sns-other-topic", "Effect": "Deny", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:123456789012:function:my-function", "arn:aws:lambda:us-east-2:123456789012:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:restricted-topic" } } } ] }
このポリシーを policy.json という名前のファイルに保存し、適用します。put-resource-policy
aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function\ --policy file://policy.json
Amazon S3 では、ソースは、ARN にアカウント ID が含まれないバケットになります。バケットを削除すると別のアカウントで同じ名前のバケットが作成される可能性があります。aws:SourceAccount 条件キーを使用すると、自分のアカウントにあるリソースのみで関数を呼び出せます。
{ "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:123456789012:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }
add-permission を使う
シンプルなユースケースの場合、add-permission を使用して個々のステートメントを追加できます。次のコマンドは、my-function という名前の関数を呼び出すためのアクセス許可を Amazon Simple Notification Service に付与します。
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"}
注記
put-resource-policy の後に add-permission を呼び出すと、新しいステートメントが既存の JSON ポリシーに追加されます。
呼び出しを特定のリソースに制限するには、source-arn オプションを使用します。
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
Amazon S3 の場合は、アカウント 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:::amzn-s3-demo-bucket\ --source-account123456789012