

# Lambda 関数ログを Amazon S3 に送信する
<a name="logging-with-s3"></a>

Lambda コンソールを使用してログを Amazon S3 に直接送信するように Lambda 関数を設定できます。この機能は、コスト効率の高い長期ログストレージソリューションを提供するとともに、Athena などのサービスによる強力な分析オプションの利用を可能にします。

**注記**  
これにより、Lambda コンソール、AWS CLI、AWS CloudFormation、あるいはすべての AWS SDK を使用して、Lambda関数ログを Amazon S3 に送信するように設定できます。

## 料金
<a name="logging-s3-pricing"></a>

料金の詳細については、「[Amazon CloudWatch pricing](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs)」を参照してください。

## Amazon S3 ログの送信先に必要なアクセス許可
<a name="logging-s3-permissions"></a>

Lambda コンソールを使用して Amazon S3 を関数のログ送信先に設定するには、次の要件を満たしている必要があります。

1. Lambda で CloudWatch Logs を使用するのに[必要な IAM アクセス許可](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs)。

1. [Amazon S3 への Lambda 関数ログの送信向けに CloudWatch Logs のサブスクリプションフィルターをセットアップする](#using-cwl-subscription-filter-lambda-s3) の実行。このフィルターは、どのログイベントを Amazon S3 バケットに配信するかを定義します。

## Amazon S3 への Lambda 関数ログの送信向けに CloudWatch Logs のサブスクリプションフィルターをセットアップする
<a name="using-cwl-subscription-filter-lambda-s3"></a>

CloudWatch Logs から Amazon S3 にログを送信するには、サブスクリプションフィルターを作成する必要があります。このフィルターは、どのログイベントを Amazon S3 バケットに配信するかを定義します。この Amazon S3 バケットは、ロググループと同じリージョンに存在する必要があります。

### Amazon S3 のサブスクリプションフィルターを作成する方法
<a name="create-subscription-filter-s3"></a>

1. Amazon Simple Storage Service (Amazon S3) バケットを作成します。CloudWatch Logs 専用に作成したバケットを使用することをお勧めします。ただし、既存のバケットを使用する場合は、ステップ 2 に進みます。

   次のコマンドを実行します。プレースホルダーリージョンは、使用するリージョンに置き換えます。

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```
**注記**  
`amzn-s3-demo-bucket2` は Amazon S3 バケット名の例です。この名前はすでに*予約*されています。手順が正しく機能するためには、この名前を一意の Amazon S3 バケット名に置き換える必要があります。

   出力例を次に示します。

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. Amazon S3 バケットにデータを置くため、CloudWatch Logs アクセス許可を付与する IAM ロールを作成します。このポリシーには、「混乱した代理」のセキュリティ問題を防止するための aws:SourceArn グローバル条件コンテキストキーが含まれています。詳細については、「[Confused deputy prevention](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-confused-deputy.html)」を参照してください。

   1. テキストエディタを使用して、次のようにファイル `~/TrustPolicyForCWL.json` 内に信頼ポリシーを作成します。

      ```
      {
          "Statement": {
              "Effect": "Allow",
              "Principal": { "Service": "logs.amazonaws.com" },
              "Condition": { 
                  "StringLike": {
                      "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                  } 
               },
              "Action": "sts:AssumeRole"
          } 
      }
      ```

   1. create-role コマンドを使用し、信頼ポリシーファイルを指定して IAM ロールを作成します。後のステップで必要になるため、返された Role.Arn 値を書き留めます。

      ```
      aws iam create-role \
       --role-name CWLtoS3Role \
       --assume-role-policy-document file://~/TrustPolicyForCWL.json
      {
          "Role": {
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Action": "sts:AssumeRole",
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "logs.amazonaws.com"
                      },
                      "Condition": { 
                          "StringLike": {
                              "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                          } 
                      }
                  }
              },
              "RoleId": "AAOIIAH450GAB4HC5F431",
              "CreateDate": "2015-05-29T13:46:29.431Z",
              "RoleName": "CWLtoS3Role",
              "Path": "/",
              "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role"
          }
      }
      ```

1. 権限ポリシーを作成し、CloudWatch Logs がアカウントで実行できるアクションを定義します。まず、テキストエディタを使用してファイル `~/PermissionsForCWL.json` で権限ポリシーを作成します。

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": ["s3:PutObject"],
         "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2/*"]
       }
     ]
   }
   ```

   次の `put-role-policy` コマンドを入力して、アクセス許可ポリシーをロールに関連付けます。

   ```
   aws iam put-role-policy --role-name CWLtoS3Role --policy-name Permissions-Policy-For-S3 --policy-document file://~/PermissionsForCWL.json
   ```

1. `Delivery` ロググループを作成するか、もしくは既存の `Delivery` ロググループを使用します。

   ```
   aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
   ```

1. `PutSubscriptionFilter` で送信先をセットアップする

   ```
   aws logs put-subscription-filter
   --log-group-name my-logs
   --filter-name my-lambda-delivery
   --filter-pattern ""
   --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2
   --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role
   --region REGION_NAME
   ```

## Lambda 関数ログを Amazon S3 に送信する
<a name="logging-s3-setup"></a>

Lambda コンソールでは、新しい関数を作成した後に関数ログを Amazon S3 に直接送信できます。これには、次の手順を実行してください。

1. AWS マネジメントコンソールにサインインし、Lambda コンソールを開きます。

1. 関数の名前を選択します。

1. **[設定]** タブを選択します。

1. **モニタリングツールとオペレーションツール**タブを選択します。

1. 「ログ設定」セクションで **[編集]** を選択します。

1. 「ログコンテンツ」セクションでログ形式を選択します。

1. 「ログ送信先」セクションで、次の手順を実行してください。

   1. 送信先サービスを選択します。

   1. **[新規のロググループを作成]** と **[既存のロググループを使用]** のいずれかを選択します。
**注記**  
既存のロググループを Amazon S3 の送信先に設定する場合、設定するロググループが `Delivery` ロググループタイプであることを確認してください。

   1. 関数ログの送信先となる Amazon S3 バケットを選択します。

   1. CloudWatch `Delivery` ロググループが表示されます。

1. **[保存]** を選択します。

**注記**  
コンソールで指定した IAM ロールが必要なアクセス許可を持っていないと、送信先のセットアップは失敗します。これを解決するには、「[Amazon S3 ログの送信先に必要なアクセス許可](#logging-s3-permissions)」を参照してください。

## クロスアカウントログ記録
<a name="cross-account-logging-s3"></a>

別の AWS アカウントの Amazon S3 バケットにログを送信するように Lambda を設定できます。送信先を設定すると共に、両方のアカウントで適切なアクセス許可を設定する必要があります。

必要な IAM ロールおよびポリシーなど、クロスアカウントログ記録のセットアップに関する詳細な手順については、CloudWatch Logs ドキュメントの「[Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html)」を参照してください。