

# デプロイに関する考慮事項
<a name="deployment-considerations"></a>

次のセクションでは、このソリューションを実装するための制約と考慮事項について説明します。

## AWS WAF ルール
<a name="aws-waf-rules"></a>

このソリューションが生成するウェブ ACL は、ウェブアプリケーションを包括的に保護するように設計されています。このソリューションは、ウェブ ACL に追加できる一連の AWS マネージドルールおよびカスタムルールを提供します。ルールを含めるには、CloudFormation スタックを起動するときに関連するパラメータで [`yes`] を選択します。パラメータのリストに関しては「[ステップ 1. スタックを起動する](step-1.-launch-the-stack.md)」を参照してください。

**注記**  
すぐに使用できるソリューションは [AWS Firewall Manager](https://aws.amazon.com/firewall-manager) をサポートしていません。Firewall Manager でルールを使用する場合は、[ソースコード](https://github.com/aws-solutions/aws-waf-security-automations)にカスタマイズを適用することをお勧めします。

## ウェブ ACL トラフィックロギング
<a name="web-acl-traffic-logging"></a>

米国東部 (バージニア北部) 以外の AWS リージョンでスタックを作成して、**エンドポイント** を [`CloudFront`] に設定する場合は、**Activate HTTP Flood Protection** を [`no`] または [`yes - AWS WAF rate based rule`] に設定する必要があります。

他の 2 つのオプション (`yes - AWS Lambda log parser` と `yes - Amazon Athena log parser`) では、すべての AWS エッジロケーションで実行されるウェブ ACL で AWS WAF ログをアクティブ化する必要があります。これは米国東部 (バージニア北部) 以外ではサポートされていません。ウェブ ACL トラフィックのロギングに関する詳細については、「[AWS WAF 開発者ガイド](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html)」を参照してください。

## 過剰サイズのリクエストコンポーネントの処理
<a name="oversize-handling-for-request-components"></a>

AWS WAF は、ウェブリクエストコンポーネント本文、ヘッダー、または cookie のオーバーサイズのコンテンツの検査をサポートしていません。これらのリクエストコンポーネントタイプの 1 つを検査するルールステートメントを作成する場合、これらのオプションのいずれかを選択して、これらのリクエストの処理方法を AWS WAF に指示できます。
+  `yes` (continue) – ルール検査基準に従って、リクエストコンポーネントを通常どおり検査します。AWS WAF は、サイズ制限内のリクエストコンポーネントのコンテンツを検査します。このソリューションで使用するデフォルトのオプションです。
+  `yes - MATCH` - ウェブリクエストをルールステートメントと一致するものとして扱います。AWS WAF は、ルールの検査基準に照らして評価することなく、ルールアクションをリクエストに適用します。`Block` アクションのルールの場合、オーバーサイズコンポーネントでのリクエストをブロックします。
+  `yes - NO_MATCH` – ルールの検査基準に対して評価せずに、ウェブリクエストをルールステートメントに一致しないものとして扱います。AWS WAF は、一致しないルールの場合と同様に、ウェブ ACL の残りのルールを使用してウェブリクエストの検査を続行します。

詳細については、「[AWS WAF でのオーバーサイズウェブリクエストコンポーネントの処理](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-oversize-handling.html)」を参照してください。

## 複数のソリューションデプロイ
<a name="multiple-solution-deployments"></a>

ソリューションは、同じアカウントとリージョンに複数回デプロイできます。デプロイごとに一意の CloudFormation スタック名と Amazon S3 バケット名を使用する必要があります。それぞれの固有のデプロイメントには追加料金が発生し、アカウントごと、リージョンごとの [AWS WAF クォータ](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)が適用されます。

## デプロイに必要なロールの最小限のアクセス許可 (オプション)
<a name="minimum-role-permissions"></a>

お客様は、デプロイに必要な最小限のアクセス許可を持つ IAM ロールを手動で作成できます。
+ WAF のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "wafv2:CreateWebACL",
                "wafv2:UpdateWebACL",
                "wafv2:DeleteWebACL",
                "wafv2:GetWebACL",
                "wafv2:ListWebACLs",
                "wafv2:CreateIPSet",
                "wafv2:UpdateIPSet",
                "wafv2:DeleteIPSet",
                "wafv2:GetIPSet",
                "wafv2:AssociateWebACL",
                "wafv2:DisassociateWebACL",
                "wafv2:PutLoggingConfiguration",
                "wafv2:DeleteLoggingConfiguration",
                "wafv2:ListWebACLs",
                "wafv2:ListIPSets",
                "wafv2:ListTagsForResource"
            ],
            "Resource": [
                "arn:aws:wafv2:*:*:regional/webacl/*",
                "arn:aws:wafv2:*:*:regional/ipset/*",
                "arn:aws:wafv2:*:*:global/webacl/*",
                "arn:aws:wafv2:*:*:global/ipset/*"
            ]
        }
```
+ Lambda のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunction",
                "lambda:InvokeFunction",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration",
                "lambda:AddPermission",
                "lambda:RemovePermission"
            ],
            "Resource": "arn:aws:lambda:*:*:function:*"
        }
```
+ Firehose のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "firehose:CreateDeliveryStream",
                "firehose:DeleteDeliveryStream",
                "firehose:DescribeDeliveryStream",
                "firehose:StartDeliveryStreamEncryption",
                "firehose:StopDeliveryStreamEncryption",
                "firehose:UpdateDestination"
            ],
            "Resource": "arn:aws:firehose:*:*:deliverystream/*"
        }
```
+ S3 のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:DeleteBucketPolicy",
                "s3:GetBucketAcl",
                "s3:GetBucketPolicy",
                "s3:GetObject",
                "s3:PutBucketAcl",
                "s3:PutBucketPolicy",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketVersioning",
                "s3:PutEncryptionConfiguration",
                "s3:PutObject",
                "s3:PutBucketTagging",
                "s3:PutLifecycleConfiguration",
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:PutBucketLogging",
                "s3:GetBucketLogging"
            ],
            "Resource": "arn:aws:s3:::*"
        }
```
+ Athena アクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:GetWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:StartQueryExecution",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:StopQueryExecution"
            ],
            "Resource": "arn:aws:athena:*:*:workgroup/WAF*"
        }
```
+ Glue のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateDatabase",
                "glue:DeleteDatabase",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:UpdateDatabase",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:UpdateTable"
            ],
            "Resource": [
                "arn:aws:glue:*:*:catalog",
                "arn:aws:glue:*:*:database/*",
                "arn:aws:glue:*:*:table/*/*",
                "arn:aws:glue:*:*:userDefinedFunction/*"
            ]
        }
```
+ CloudWatch Logs のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DeleteLogGroup",
                "logs:DeleteLogStream",
                "logs:PutRetentionPolicy",
                "logs:DescribeLogGroups"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:/aws/lambda/*",
                "arn:aws:logs:*:*:log-group:*",
                "arn:aws:logs:*:*:log-group:/aws/kinesisfirehose/*"
            ]
        }
```
+ CloudWatch のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:DeleteDashboards",
                "cloudwatch:GetDashboard",
                "cloudwatch:ListDashboards",
                "cloudwatch:PutDashboard",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        }
```
+ SNS のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "sns:CreateTopic",
                "sns:DeleteTopic",
                "sns:Subscribe",
                "sns:Unsubscribe",
                "sns:SetTopicAttributes"
            ],
            "Resource": "arn:aws:sns:*:*:*"
        }
```
+ DynamoDB のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:CreateTable",
                "dynamodb:DeleteTable",
                "dynamodb:DescribeTable",
                "dynamodb:PutItem",
                "dynamodb:GetItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*"
        }
```
+ CloudFormation のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStacks",
                "cloudformation:UpdateStack",
                "cloudformation:ListStacks"
            ],
            "Resource": "arn:aws:cloudformation:*:*:stack/*/*"
        }
```
+ Service Catalog App Registry のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "servicecatalog:CreateApplication",
                "servicecatalog:DeleteApplication",
                "servicecatalog:GetApplication",
                "servicecatalog:TagResource",
                "servicecatalog:CreateAttributeGroup",
                "servicecatalog:DeleteAttributeGroup",
                "servicecatalog:GetAttributeGroup",
                "servicecatalog:AssociateAttributeGroup",
                "servicecatalog:DisassociateAttributeGroup",
                "servicecatalog:AssociateResource",
                "servicecatalog:DisassociateResource"
            ],
            "Resource": "arn:aws:servicecatalog:*:*:*"
        }
```
+ X-Ray のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords"
            ],
            "Resource": "*"
        }
```
+ IAM 許可

```
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreatePolicy",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListRoles",
                "iam:PassRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/*"
        }
```
+ EventBridge のアクセス許可

```
        {
            "Effect": "Allow",
            "Action": [
                "events:PutTargets",
                "events:RemoveTargets",
                "events:DescribeRule",
                "events:EnableRule",
                "events:ListRules",
                "events:PutRule",
                "events:DeleteRule",
                "events:ListEventSources",
                "events:DescribeEventSource",
                "events:ActivateEventSource",
                "events:DeactivateEventSource"
            ],
            "Resource": "arn:aws:events:*:*:rule/*"
        }
```