

# Lambda でのリソースベースの IAM ポリシーの表示
<a name="access-control-resource-based"></a>

Lambda では、Lambda 関数およびレイヤーのための、リソースベースのアクセス許可ポリシーをサポートしています。リソースベースのポリシーを使用して、他の [AWS アカウント](permissions-function-cross-account.md)、[組織](permissions-function-organization.md)、または[サービス](permissions-function-services.md)へのアクセスを許可できます。リソースベースのポリシーは、1 つの関数、バージョン、エイリアス、レイヤーバージョンに適用されます。

------
#### [ Console ]

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

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. 関数を選択します。

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

1. [**リソースベースのポリシー**] まで下にスクロールし、[**View policy document (ポリシードキュメントの表示)**] を選択します。リソースベースのポリシーには、別のアカウントまたは AWS のサービスが関数にアクセスしようとしたときに適用されるアクセス許可が表示されます。次の例は、アカウント `123456789012` の `amzn-s3-demo-bucket` という名前のバケットに対して `my-function` という名前の関数を呼び出すことを Amazon S3 に許可するステートメントを示しています。  
**Example リソースベースのポリシー**    
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "default",
       "Statement": [
           {
               "Sid": "lambda-allow-s3-my-function",
               "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:::amzn-s3-demo-bucket"
                 }
               }
           }
        ]
   }
   ```

------
#### [ AWS CLI ]

関数のリソースベースのポリシーを表示するには、`get-policy` コマンドを使用します。

```
aws lambda get-policy \
  --function-name my-function \
  --output text
```

次のような出力が表示されます。

****  

```
{"Version":"2012-10-17",		 	 	 "Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.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:lambda*"}}}]}
```

バージョンおよびエイリアスでは、バージョン番号またはエイリアスを関数名に追加します。

```
aws lambda get-policy --function-name my-function:PROD
```

関数からアクセス許可を削除するには、`remove-permission` を使用します。

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

レイヤーでのアクセス許可を表示するには、`get-layer-version-policy` コマンドを使用します。

```
aws lambda get-layer-version-policy \
  --layer-name my-layer \
  --version-number 3 \
  --output text
```

次のような出力が表示されます。

```
b0cd9796-d4eb-4564-939f-de7fe0b42236    {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

`remove-layer-version-permission` を使用して、ポリシーからステートメントを削除します。

```
aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org
```

------

## サポートされている API アクション
<a name="permissions-resource-api"></a>

次の Lambda API アクションは、リソースベースのポリシーをサポートしています。
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)
+ [DeleteFunction](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunction.html)
+ [DeleteFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionConcurrency.html)
+ [DeleteFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionEventInvokeConfig.html)
+ [DeleteProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteProvisionedConcurrencyConfig.html)
+ [GetAlias](https://docs.aws.amazon.com/lambda/latest/api/API_GetAlias.html)
+ [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)
+ [GetFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConcurrency.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [GetFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionEventInvokeConfig.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [GetProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetProvisionedConcurrencyConfig.html)
+ [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [InvokeFunctionUrl](urls-auth.md)（アクセス許可のみ）
+ [ListAliases](https://docs.aws.amazon.com/lambda/latest/api/API_ListAliases.html)
+ [ListFunctionEventInvokeConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionEventInvokeConfigs.html)
+ [ListProvisionedConcurrencyConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListProvisionedConcurrencyConfigs.html)
+ [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)
+ [ListVersionsByFunction](https://docs.aws.amazon.com/lambda/latest/api/API_ListVersionsByFunction.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
+ [PutFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionConcurrency.html)
+ [PutFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html)
+ [PutProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutProvisionedConcurrencyConfig.html)
+ [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)
+ [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionEventInvokeConfig.html)

# Lambda 関数へのアクセス権を AWS のサービスに付与する
<a name="permissions-function-services"></a>

[AWS のサービスを使用して関数を呼び出す](lambda-services.md)場合は、リソースベースのポリシーのステートメントでアクセス許可を付与します。このステートメントを、関数全体に適用することも、単一のバージョンまたはエイリアスに制限することもできます。

**注記**  
Lambda コンソールで関数にトリガーを追加すると、サービスでその関数を呼び出せるように、関数のリソースベースのポリシーがコンソールで更新されます。Lambda コンソールで使用できない他のアカウントやサービスにアクセス許可を付与するには、AWS CLI を使用します。

[add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) コマンドを使用してステートメントを追加します。最もシンプルなリソースベースのポリシーのステートメントでは、サービスで関数を呼び出すことができます。次のコマンドは、`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"}
```

これにより、Amazon SNS は関数に対して [呼び出し](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) API アクションを呼び出すことができますが、呼び出しをトリガーする Amazon SNS トピックは制限されません。関数が特定のリソースからのみ呼び出せるようにするには、`source-arn` オプションでリソースの Amazon リソースネーム (ARN) を指定します。次のコマンドは、Amazon SNS に、`my-topic` という名前のトピックをサブスクリプションするための、関数を呼び出すことのみ許可します。

```
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
```

一部のサービスでは、他のアカウントで関数を呼び出すことができます。アカウント ID を含むソース ARN を指定した場合は問題ではありません。ただし、Amazon S3 では、ソースは、ARN にアカウント ID が含まれないバケットになります。バケットを削除すると、別のアカウントで同じ名前のバケットが作成される可能性があります。アカウントのリソースでのみ関数を呼び出せるように、アカウント 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-account 123456789012
```

# 関数へのアクセス権を組織に付与する
<a name="permissions-function-organization"></a>

[AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) の組織にアクセス許可を付与するには、組織 ID を `principal-org-id` として指定します。次の [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) コマンドは、組織 `o-a1b2c3d4e5f` 内のすべてのユーザーに呼び出しアクセス権を付与します。

```
aws lambda add-permission \
  --function-name example \
  --statement-id PrincipalOrgIDExample \
  --action lambda:InvokeFunction \
  --principal * \
  --principal-org-id o-a1b2c3d4e5f
```

**注記**  
このコマンドでは、`Principal` は `*` です。これにより、組織 `o-a1b2c3d4e5f` 内のすべてのユーザーが関数呼び出しアクセス許可を取得します。AWS アカウント またはロールを `Principal` として指定した場合、そのプリンシパルだけが関数呼び出しアクセス許可を取得します。ただし、それらが `o-a1b2c3d4e5f` 組織の一部である場合に限ります。

このコマンドで、次のようなリソースベースのポリシーが作成されます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PrincipalOrgIDExample",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:example",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-a1b2c3d4e5f"
                }
            }
        }
    ]
}
```

------

詳細については、「IAM ユーザーガイド」の「[aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)」を参照してください。

# Lambda 関数へのアクセス権を他のアカウントに付与する
<a name="permissions-function-cross-account"></a>

関数を別の AWS アカウント と共有するには、クロスアカウントアクセス許可ステートメントを関数の[リソースベースのポリシー](access-control-resource-based.md)に追加します。[add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) コマンドを実行し、アカウント ID を `principal` として指定します。次の例では、`111122223333` エイリアスを使用して `my-function` を呼び出すアクセス許可をアカウント `prod` に付与します。

```
aws lambda add-permission \
  --function-name my-function:prod \
  --statement-id xaccount \
  --action lambda:InvokeFunction \
  --principal 111122223333 \
  --output text
```

次のような出力が表示されます。

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-1:123456789012:function:my-function"}
```

リソースベースのポリシーは、他のアカウントに対して関数へのアクセス許可を付与しますが、そのアカウントのユーザーに対してはユーザーに付与済みのアクセス許可を超える許可を付与しません。他のアカウントのユーザーが Lambda API を使用するには、対応する[ユーザー権限](access-control-identity-based.md)が必要です。

別のアカウントのユーザーまたはロールへのアクセスを制限するには、ID の完全な ARN をプリンシパルとして指定します。例えば、`arn:aws:iam::123456789012:user/developer` と指定します。

[エイリアス](configuration-aliases.md)では、他のアカウントが呼び出すことができるバージョンを制限します。この方法では、他のアカウントは、エイリアスを関数 ARN を含める必要があります。

```
aws lambda invoke \
  --function-name arn:aws:lambda:us-east-2:123456789012:function:my-function:prod out
```

次のような出力が表示されます。

```
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}
```

その後、関数の所有者は、新しいバージョンを参照するようにエイリアスを更新できます。これにより、呼び出し元で関数を呼び出す方法を変更する必要がなくなります。また、他のアカウントは、新しいバージョンを使用するようにコードを変更する必要もなくなります。エイリアスに関連付けられた関数のバージョンを呼び出すアクセス許可が付与されるだけです。

既存の関数で動作するほとんどの API アクションにクロスアカウントアクセスを付与できます。例えば、アカウントによるエイリアスのリストの取得を許可する `lambda:ListAliases`、または関数コードのダウンロードを許可する `lambda:GetFunction` へのアクセス権を付与することができます。各アクセス許可を個別に追加するか、`lambda:*` を使用して、指定された関数のすべてのアクションに対するアクセス権を付与します。

他のアカウントに複数の関数に対するアクセス許可、または関数で実行しないアクションに対するアクセス許可を付与するには、[IAM ロール](access-control-identity-based.md)を使用することをお勧めします。

# 他のアカウントに Lambda レイヤーへのアクセス許可を付与する
<a name="permissions-layer-cross-account"></a>

レイヤーを別の AWS アカウント と共有するには、レイヤーの[リソースベースのポリシー](access-control-resource-based.md) にクロスアカウントアクセス許可ステートメントを追加します。[add-layer-version-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-layer-version-permission.html) コマンドを実行し、アカウント ID を として指定します`principal`。アクセス許可は、各ステートメントで、1 つのアカウント、すべてのアカウント、または [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 内の組織に付与することができます。

以下の例では、アカウント 111122223333 に `bash-runtime` レイヤーのバージョン 2 へのアクセス許可を付与します。

```
aws lambda add-layer-version-permission \
  --layer-name bash-runtime \
  --version-number 2 \  
  --statement-id xaccount \
  --action lambda:GetLayerVersion \
  --principal 111122223333 \
  --output text
```

次のような出力が表示されます。

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
```

アクセス許可は、単一レイヤーバージョンにのみ適用されます。新しいレイヤーバージョンを作成するたびに、このプロセスを繰り返します。

[AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 組織のすべてのアカウントにアクセス許可を付与するには、`organization-id` オプションを使用します。以下の例では、バージョン 3 の `my-layer` を使用する `o-t194hfs8cz` アクセス許可を、組織のすべてのアカウントに付与します。

```
aws lambda add-layer-version-permission \
  --layer-name my-layer \
  --version-number 3 \
  --statement-id engineering-org \
  --principal '*' \
  --action lambda:GetLayerVersion \
  --organization-id o-t194hfs8cz \
  --output text
```

以下の出力が表示されます。

```
{"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

複数のアカウントまたは組織にアクセス許可を付与するには、複数のステートメントを追加する必要があります。