

# ソース関数 ARN を使用した関数のアクセス動作の制御
<a name="permissions-source-function-arn"></a>

一般的に、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 を挿入します。


| サービス | Action | Reason | 
| --- | --- | --- | 
| CloudWatch Logs | 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) の呼び出し。
+ [イベントソースマッピング](invocation-eventsourcemapping.md)としてセットアップされたイベントソースから読み込むための、Amazon Simple Queue Service (Amazon SQS) などの AWS のサービスの呼び出し。

認証情報コンテキストに挿入されたソース関数 ARN を使用すると、特定の Lambda 関数のコードからリソースへの呼び出しが行われたのかどうかを確認できます。これを確認するには、IAM ID ベースのポリシーまたは[サービスコントロールポリシー (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) で `lambda:SourceFunctionArn` 条件キーを使用します。

**注記**  
リソースベースのポリシーにある `lambda:SourceFunctionArn` は使用できませんでした。

ID ベースのポリシーまたは SCP でこの条件キーを使用することで、関数コードが他の AWS のサービスに対し実行する、API アクションのためのセキュリティ制御を実装できます。こういったセキュリティアプリケーションには、認証情報の漏洩の原因を特定する場合など、重要なものがいくつか含まれています。

**注記**  
`lambda:SourceFunctionArn` 条件キーは、`lambda:FunctionArn` および `aws:SourceArn` 条件キーとは異なります。`lambda:FunctionArn` 条件キーは、[イベントソースマッピング](invocation-eventsourcemapping.md)にのみ適用され、イベントソースから呼び出しが可能な関数を定義するのに使用されます。`aws:SourceArn` 条件キーは、Lambda 関数がターゲットリソースであるポリシーにのみ適用され、その機能を呼び出すことができる他の AWS のサービスとリソースを定義するのに役立ちます。`lambda:SourceFunctionArn` 条件キーは任意の ID ベースのポリシーまたは SCP に適用して、他のリソースに対して特定の AWS API コールを行う許可を持つ特定の Lambda 関数を定義します。

ポリシーで `lambda:SourceFunctionArn` を使用するには、それを、任意の [ARN 条件演算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN)に条件として含めます。キーの値は有効な ARN にする必要があります。

例えば、Lambda 関数のコードが特定の Amazon S3 バケットをターゲットとして、`s3:PutObject` 呼び出しを実行したとします。これには、Lambda 関数の 1 つだけに、対象のバケットに対する `s3:PutObject` アクセスを許可する必要があります。この場合、関数の実行ロールには、次のようなポリシーがアタッチされている必要があります。

**Example 特定の 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 は、これを示したものです。

**Example 特定の条件下で 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` を認識します。