一般的に、Lambda 関数のコードは、他の AWS のサービスに対し API リクエストを送信します。これらのリクエストを行うために、Lambda は関数の実行ロールを引き受けることによって、認証情報のセットを一時的に生成します。これらの認証情報は、関数の呼び出し中に環境変数として利用できます。AWS SDK を使用している場合に、コード内で SDK の認証情報を直接提供する必要はありません。デフォルトで、認証情報プロバイダーチェーンは認証情報を設定できる各場所を順番にチェックし、最初に利用できるものを選択します。これは通常、環境変数 (AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、および AWS_SESSION_TOKEN
) です。
Lambda は、リクエストが実行環境内から実行される AWS API リクエストである場合、ソース関数 ARN を認証情報コンテキストに挿入します。Lambda は、Lambda がユーザーに代わって実行環境外で実行する以下の AWS API リクエストにも、ソース関数 ARN を挿入します。
サービス | アクション | 理由 |
---|---|---|
CloudWatch ログ | CreateLogGroup , CreateLogStream , PutLogEvents |
CloudWatch Logs ロググループにログを保存する |
X-Ray | PutTraceSegments |
X-Ray にトレースデータを送信する |
Amazon EFS | ClientMount |
関数を Amazon Elastic File System (Amazon EFS) ファイルシステムに接続する |
ソース関数 ARN は、Lambda が同じ実行ロールを使用して、実行環境外でユーザーに代わって実行するその他の AWS API 呼び出しには含まれていません。このように、実行環境外で実行される API 呼び出しの例としては、以下が挙げられます。
-
環境変数を自動的に暗号化および復号化するための AWS Key Management Service (AWS KMS) の呼び出し。
-
VPC 対応関数用の Elastic Network Interfaces (ENI) を作成するための Amazon Elastic Compute Cloud (Amazon EC2) の呼び出し。
-
イベントソースマッピングとしてセットアップされたイベントソースから読み込むための、Amazon Simple Queue Service (Amazon SQS) などの AWS のサービスの呼び出し。
認証情報コンテキストに挿入されたソース関数 ARN を使用すると、特定の Lambda 関数のコードからリソースへの呼び出しが行われたのかどうかを確認できます。これを確認するには、IAM ID ベースのポリシーまたはサービスコントロールポリシー (SCP) で lambda:SourceFunctionArn
条件キーを使用します。
注記
リソースベースのポリシーにある lambda:SourceFunctionArn
は使用できませんでした。
ID ベースのポリシーまたは SCP でこの条件キーを使用することで、関数コードが他の AWS のサービスに対し実行する、API アクションのためのセキュリティ制御を実装できます。こういったセキュリティアプリケーションには、認証情報の漏洩の原因を特定する場合など、重要なものがいくつか含まれています。
注記
lambda:SourceFunctionArn
条件キーは、lambda:FunctionArn
および aws:SourceArn
条件キーとは異なります。lambda:FunctionArn
条件キーは、イベントソースマッピングにのみ適用され、イベントソースから呼び出しが可能な関数を定義するのに使用されます。aws:SourceArn
条件キーは、Lambda 関数がターゲットリソースであるポリシーにのみ適用され、その機能を呼び出すことができる他の AWS のサービスとリソースを定義するのに役立ちます。lambda:SourceFunctionArn
条件キーは任意の ID ベースのポリシーまたは SCP に適用して、他のリソースに対して特定の AWS API 呼び出しを行う許可を持つ特定の Lambda 関数を定義します。
ポリシーで lambda:SourceFunctionArn
を使用するには、それを、任意の ARN 条件演算子に条件として含めます。キーの値は有効な ARN にする必要があります。
例えば、Lambda 関数のコードが特定の Amazon S3 バケットをターゲットとして、s3:PutObject
呼び出しを実行したとします。これには、Lambda 関数の 1 つだけに、対象のバケットに対する s3:PutObject
アクセスを許可する必要があります。この場合、関数の実行ロールには、次のようなポリシーがアタッチされている必要があります。
例 特定の Lambda 関数に Amazon S3 リソースへのアクセスを許可するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExampleSourceFunctionArn",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Condition": {
"ArnEquals": {
"lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
}
}
}
]
}
このポリシーでは、ARN が arn:aws:lambda:us-east-1:123456789012:function:source_lambda
である Lambda 関数がソースの場合にのみ、s3:PutObject
アクセスを許可します。このポリシーは、他の呼び出し ID に対して s3:PutObject
アクセスを許可することはありません。別の関数またはエンティティが、同じ実行ロールを使用し s3:PutObject
呼び出しを行った場合も同様です。
注記
lambda:SourceFunctionARN
条件キーは、Lambda 関数のバージョンや関数エイリアスをサポートしていません。特定の関数バージョンまたはエイリアスの ARN を使用しても、関数には指定したアクションを実行するアクセス許可は付与されません。関数には、必ずバージョンやエイリアスのサフィックスが付いていない、修飾されていない ARN を使用してください。
SCP で lambda:SourceFunctionArn
を使用することもできます。例えば、バケットへのアクセスを、単一の Lambda 関数のコードまたは特定の Amazon Virtual Private Cloud (VPC) からの呼び出しに制限したいとします。以下の SCP は、これを示したものです。
例 特定の条件下で Amazon S3 へのアクセスを拒否するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Effect": "Deny",
"Condition": {
"StringNotEqualsIfExists": {
"aws:SourceVpc": [
"vpc-12345678"
]
}
}
},
{
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Effect": "Deny",
"Condition": {
"ArnNotEqualsIfExists": {
"lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
}
}
}
]
}
このポリシーは、ARN arn:aws:lambda:*:123456789012:function:source_lambda
を持つ特定の Lambda 関数からのものでない限り、または指定された VPC からのものでない限り、すべての S3 アクションを拒否します。StringNotEqualsIfExists
演算子は、aws:SourceVpc
キー がリクエストに含まれている場合にのみ、IAM に対し、この条件を処理することを指示します。これと同様に、IAM は lambda:SourceFunctionArn
が存在する場合にのみ ArnNotEqualsIfExists
を認識します。