Repository: getmoto/moto
Pull request #7238 (2024-01-22 13:12:59)

Using Enum for s3 notification events
- S3 notification events are updated.
- Using an enum for the event list.
- Refactoring error message.

Documents for the supported event: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/put_bucket_notification_configuration.html

![image](https://github.com/getmoto/moto/assets/61897166/53c92eef-ae5b-48bf-a839-bae503d41e56)



Patch:
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
index db3be8416..ff1a1e89b 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-1.json
@@ -4647,6 +4647,50 @@
   "InstanceType": "r7gd.xlarge",
   "Location": "apne1-az2"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "apne1-az2"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "apne1-az2"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "apne1-az2"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
index e6093bb26..6ef98b9a7 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/ap-northeast-2.json
@@ -1763,6 +1763,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "apne2-az1"
  },
+ {
+  "InstanceType": "u-12tb1.112xlarge",
+  "Location": "apne2-az1"
+ },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "apne2-az1"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
index c88c855a7..28313c772 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/eu-west-2.json
@@ -1667,6 +1667,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw2-az1"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "euw2-az1"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw2-az1"
@@ -3795,6 +3799,50 @@
   "InstanceType": "c5n.xlarge",
   "Location": "euw2-az3"
  },
+ {
+  "InstanceType": "c6a.12xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.16xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.24xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.2xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.32xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.48xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.4xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.8xlarge",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.large",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.metal",
+  "Location": "euw2-az3"
+ },
+ {
+  "InstanceType": "c6a.xlarge",
+  "Location": "euw2-az3"
+ },
  {
   "InstanceType": "c6g.12xlarge",
   "Location": "euw2-az3"
@@ -5211,6 +5259,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "euw2-az3"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "euw2-az3"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "euw2-az3"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
index 9078869ef..3a9fc7b19 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-1.json
@@ -1287,6 +1287,86 @@
   "InstanceType": "m6id.xlarge",
   "Location": "use1-az1"
  },
+ {
+  "InstanceType": "m6idn.12xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.16xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.24xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.2xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.32xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.4xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.8xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.large",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.metal",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6idn.xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.12xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.16xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.24xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.2xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.32xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.4xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.8xlarge",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.large",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.metal",
+  "Location": "use1-az1"
+ },
+ {
+  "InstanceType": "m6in.xlarge",
+  "Location": "use1-az1"
+ },
  {
   "InstanceType": "m7g.12xlarge",
   "Location": "use1-az1"
@@ -3035,6 +3115,38 @@
   "InstanceType": "c7gd.xlarge",
   "Location": "use1-az2"
  },
+ {
+  "InstanceType": "c7gn.12xlarge",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.16xlarge",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.2xlarge",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.4xlarge",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.8xlarge",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.large",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.medium",
+  "Location": "use1-az2"
+ },
+ {
+  "InstanceType": "c7gn.xlarge",
+  "Location": "use1-az2"
+ },
  {
   "InstanceType": "c7i.12xlarge",
   "Location": "use1-az2"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
index f8eeb40bb..8c9296d40 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-east-2.json
@@ -2671,6 +2671,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use2-az1"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "use2-az1"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "use2-az1"
@@ -5479,6 +5483,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "use2-az2"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "use2-az2"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "use2-az2"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
index 23164d255..cbda318c0 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone-id/us-west-2.json
@@ -9955,6 +9955,86 @@
   "InstanceType": "m6id.xlarge",
   "Location": "usw2-az4"
  },
+ {
+  "InstanceType": "m6idn.12xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.16xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.24xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.2xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.32xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.4xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.8xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.large",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.metal",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6idn.xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.12xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.16xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.24xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.2xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.32xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.4xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.8xlarge",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.large",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.metal",
+  "Location": "usw2-az4"
+ },
+ {
+  "InstanceType": "m6in.xlarge",
+  "Location": "usw2-az4"
+ },
  {
   "InstanceType": "m7g.12xlarge",
   "Location": "usw2-az4"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
index 247aef8c3..009570a03 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-1.json
@@ -7367,6 +7367,50 @@
   "InstanceType": "r7gd.xlarge",
   "Location": "ap-northeast-1d"
  },
+ {
+  "InstanceType": "r7i.12xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.16xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.24xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.2xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.48xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.4xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.8xlarge",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.large",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.metal-24xl",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.metal-48xl",
+  "Location": "ap-northeast-1d"
+ },
+ {
+  "InstanceType": "r7i.xlarge",
+  "Location": "ap-northeast-1d"
+ },
  {
   "InstanceType": "t2.2xlarge",
   "Location": "ap-northeast-1d"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
index 777f39289..1cd4edecd 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/ap-northeast-2.json
@@ -1763,6 +1763,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2a"
  },
+ {
+  "InstanceType": "u-12tb1.112xlarge",
+  "Location": "ap-northeast-2a"
+ },
  {
   "InstanceType": "u-6tb1.112xlarge",
   "Location": "ap-northeast-2a"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
index 38dc1dc3b..18986d104 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/eu-west-2.json
@@ -2043,6 +2043,50 @@
   "InstanceType": "c5n.xlarge",
   "Location": "eu-west-2b"
  },
+ {
+  "InstanceType": "c6a.12xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.16xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.24xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.2xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.32xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.48xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.4xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.8xlarge",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.large",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.metal",
+  "Location": "eu-west-2b"
+ },
+ {
+  "InstanceType": "c6a.xlarge",
+  "Location": "eu-west-2b"
+ },
  {
   "InstanceType": "c6g.12xlarge",
   "Location": "eu-west-2b"
@@ -3459,6 +3503,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2b"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "eu-west-2b"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2b"
@@ -5211,6 +5259,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2c"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "eu-west-2c"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2c"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
index 8e94fa4c6..ee2e4ab36 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-1.json
@@ -1287,6 +1287,86 @@
   "InstanceType": "m6id.xlarge",
   "Location": "us-east-1a"
  },
+ {
+  "InstanceType": "m6idn.12xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.16xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.24xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.2xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.32xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.4xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.8xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.large",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.metal",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6idn.xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.12xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.16xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.24xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.2xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.32xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.4xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.8xlarge",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.large",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.metal",
+  "Location": "us-east-1a"
+ },
+ {
+  "InstanceType": "m6in.xlarge",
+  "Location": "us-east-1a"
+ },
  {
   "InstanceType": "m7g.12xlarge",
   "Location": "us-east-1a"
@@ -3035,6 +3115,38 @@
   "InstanceType": "c7gd.xlarge",
   "Location": "us-east-1b"
  },
+ {
+  "InstanceType": "c7gn.12xlarge",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.16xlarge",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.2xlarge",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.4xlarge",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.8xlarge",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.large",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.medium",
+  "Location": "us-east-1b"
+ },
+ {
+  "InstanceType": "c7gn.xlarge",
+  "Location": "us-east-1b"
+ },
  {
   "InstanceType": "c7i.12xlarge",
   "Location": "us-east-1b"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
index 2b0e332c3..488c5a672 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-east-2.json
@@ -2671,6 +2671,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2a"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "us-east-2a"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2a"
@@ -5479,6 +5483,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2b"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "us-east-2b"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2b"
diff --git a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
index 031ade678..21772f1bb 100644
--- a/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/availability-zone/us-west-2.json
@@ -9955,6 +9955,86 @@
   "InstanceType": "m6id.xlarge",
   "Location": "us-west-2d"
  },
+ {
+  "InstanceType": "m6idn.12xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.16xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.24xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.2xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.32xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.4xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.8xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.large",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.metal",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6idn.xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.12xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.16xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.24xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.2xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.32xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.4xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.8xlarge",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.large",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.metal",
+  "Location": "us-west-2d"
+ },
+ {
+  "InstanceType": "m6in.xlarge",
+  "Location": "us-west-2d"
+ },
  {
   "InstanceType": "m7g.12xlarge",
   "Location": "us-west-2d"
diff --git a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
index 88b68bc9f..a212d8624 100644
--- a/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/ap-northeast-2.json
@@ -1767,6 +1767,10 @@
   "InstanceType": "t4g.xlarge",
   "Location": "ap-northeast-2"
  },
+ {
+  "InstanceType": "u-12tb1.112xlarge",
+  "Location": "ap-northeast-2"
+ },
  {
   "InstanceType": "u-24tb1.112xlarge",
   "Location": "ap-northeast-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json b/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
index 0175f2c56..a2fd6f4a0 100644
--- a/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/eu-west-2.json
@@ -1815,6 +1815,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "eu-west-2"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "eu-west-2"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "eu-west-2"
diff --git a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
index c18be1999..bcb7d751b 100644
--- a/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
+++ b/moto/ec2/resources/instance_type_offerings/region/us-east-2.json
@@ -2723,6 +2723,10 @@
   "InstanceType": "u-6tb1.56xlarge",
   "Location": "us-east-2"
  },
+ {
+  "InstanceType": "u-9tb1.112xlarge",
+  "Location": "us-east-2"
+ },
  {
   "InstanceType": "x1.16xlarge",
   "Location": "us-east-2"
diff --git a/moto/elbv2/models.py b/moto/elbv2/models.py
index 4b3cf67ea..a748103e9 100644
--- a/moto/elbv2/models.py
+++ b/moto/elbv2/models.py
@@ -576,6 +576,9 @@ class FakeLoadBalancer(CloudFormationModel):
         "access_logs.s3.enabled",
         "access_logs.s3.bucket",
         "access_logs.s3.prefix",
+        "connection_logs.s3.bucket",
+        "connection_logs.s3.enabled",
+        "connection_logs.s3.prefix",
         "deletion_protection.enabled",
         "idle_timeout.timeout_seconds",
         "ipv6.deny_all_igw_traffic",
diff --git a/moto/elbv2/responses.py b/moto/elbv2/responses.py
index 2df73d292..8b50ab7bb 100644
--- a/moto/elbv2/responses.py
+++ b/moto/elbv2/responses.py
@@ -1578,40 +1578,6 @@ DESCRIBE_ATTRIBUTES_TEMPLATE = """<DescribeLoadBalancerAttributesResponse  xmlns
 </DescribeLoadBalancerAttributesResponse>
 """
 
-MODIFY_ATTRIBUTES_TEMPLATE = """<ModifyLoadBalancerAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
-  <ModifyLoadBalancerAttributesResult>
-  <LoadBalancerName>{{ load_balancer.name }}</LoadBalancerName>
-    <LoadBalancerAttributes>
-      <AccessLog>
-        <Enabled>{{ attributes.access_log.enabled }}</Enabled>
-        {% if attributes.access_log.enabled %}
-        <S3BucketName>{{ attributes.access_log.s3_bucket_name }}</S3BucketName>
-        <S3BucketPrefix>{{ attributes.access_log.s3_bucket_prefix }}</S3BucketPrefix>
-        <EmitInterval>{{ attributes.access_log.emit_interval }}</EmitInterval>
-        {% endif %}
-      </AccessLog>
-      <ConnectionSettings>
-        <IdleTimeout>{{ attributes.connecting_settings.idle_timeout }}</IdleTimeout>
-      </ConnectionSettings>
-      <CrossZoneLoadBalancing>
-        <Enabled>{{ attributes.cross_zone_load_balancing.enabled }}</Enabled>
-      </CrossZoneLoadBalancing>
-      <ConnectionDraining>
-        {% if attributes.connection_draining.enabled %}
-        <Enabled>true</Enabled>
-        <Timeout>{{ attributes.connection_draining.timeout }}</Timeout>
-        {% else %}
-        <Enabled>false</Enabled>
-        {% endif %}
-      </ConnectionDraining>
-    </LoadBalancerAttributes>
-  </ModifyLoadBalancerAttributesResult>
-  <ResponseMetadata>
-    <RequestId>{{ request_id }}</RequestId>
-  </ResponseMetadata>
-</ModifyLoadBalancerAttributesResponse>
-"""
-
 CREATE_LOAD_BALANCER_POLICY_TEMPLATE = """<CreateLoadBalancerPolicyResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
   <CreateLoadBalancerPolicyResult/>
   <ResponseMetadata>
diff --git a/moto/s3/exceptions.py b/moto/s3/exceptions.py
index 337a9492e..dfea0dec6 100644
--- a/moto/s3/exceptions.py
+++ b/moto/s3/exceptions.py
@@ -2,6 +2,8 @@ from typing import TYPE_CHECKING, Any, Optional, Union
 
 from moto.core.exceptions import RESTError
 
+from .notifications import S3NotificationEvent
+
 if TYPE_CHECKING:
     from moto.s3.models import FakeDeleteMarker
 
@@ -281,10 +283,13 @@ class InvalidNotificationDestination(S3ClientError):
 class InvalidNotificationEvent(S3ClientError):
     code = 400
 
-    def __init__(self) -> None:
+    def __init__(self, event_name: str) -> None:
         super().__init__(
             "InvalidArgument",
-            "The event is not supported for notifications",
+            (
+                f"The event '{event_name}' is not supported for notifications. "
+                f"Supported events are as follows: {S3NotificationEvent.events()}"
+            ),
         )
 
 
diff --git a/moto/s3/models.py b/moto/s3/models.py
index c115f96c1..480601e47 100644
--- a/moto/s3/models.py
+++ b/moto/s3/models.py
@@ -2088,7 +2088,10 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
         bucket.keys.setlist(key_name, keys)
 
         notifications.send_event(
-            self.account_id, notifications.S3_OBJECT_CREATE_PUT, bucket, new_key
+            self.account_id,
+            notifications.S3NotificationEvent.OBJECT_CREATED_PUT_EVENT,
+            bucket,
+            new_key,
         )
 
         return new_key
@@ -2640,7 +2643,10 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
 
         # Send notifications that an object was copied
         notifications.send_event(
-            self.account_id, notifications.S3_OBJECT_CREATE_COPY, bucket, new_key
+            self.account_id,
+            notifications.S3NotificationEvent.OBJECT_CREATED_COPY_EVENT,
+            bucket,
+            new_key,
         )
 
     def put_bucket_acl(self, bucket_name: str, acl: Optional[FakeAcl]) -> None:
diff --git a/moto/s3/notifications.py b/moto/s3/notifications.py
index b43ab1908..389b60070 100644
--- a/moto/s3/notifications.py
+++ b/moto/s3/notifications.py
@@ -1,11 +1,53 @@
 import json
 from datetime import datetime
+from enum import Enum
 from typing import Any, Dict, List
 
 _EVENT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
 
-S3_OBJECT_CREATE_COPY = "s3:ObjectCreated:Copy"
-S3_OBJECT_CREATE_PUT = "s3:ObjectCreated:Put"
+
+class S3NotificationEvent(str, Enum):
+    REDUCED_REDUNDANCY_LOST_OBJECT_EVENT = "s3:ReducedRedundancyLostObject"
+    OBJCET_CREATED_EVENT = "s3:ObjectCreated:*"
+    OBJECT_CREATED_PUT_EVENT = "s3:ObjectCreated:Put"
+    OBJECT_CREATED_POST_EVENT = "s3:ObjectCreated:Post"
+    OBJECT_CREATED_COPY_EVENT = "s3:ObjectCreated:Copy"
+    OBJECT_CREATED_COMPLETE_MULTIPART_UPLOAD_EVENT = (
+        "s3:ObjectCreated:CompleteMultipartUpload"
+    )
+    OBJECT_REMOVED_EVENT = "s3:ObjectRemoved:*"
+    OBJECTREMOVED_DELETE_EVENT = "s3:ObjectRemoved:Delete"
+    OBJECTREMOVED_DELETE_MARKER_CREATED_EVENT = "s3:ObjectRemoved:DeleteMarkerCreated"
+    OBJECT_RESTORE_EVENT = "s3:ObjectRestore:*"
+    OBJECT_RESTORE_POST_EVENT = "s3:ObjectRestore:Post"
+    OBJECT_RESTORE_COMPLETED_EVENT = "s3:ObjectRestore:Completed"
+    REPLICATION_EVENT = "s3:Replication:*"
+    REPLICATION_OPERATION_FAILED_REPLICATION_EVENT = (
+        "s3:Replication:OperationFailedReplication"
+    )
+    REPLICATION_OPERATION_NOT_TRACKED_EVENT = "s3:Replication:OperationNotTracked"
+    REPLICATION_OPERATION_MISSED_THRESHOLD_EVENT = (
+        "s3:Replication:OperationMissedThreshold"
+    )
+    REPLICATION_OPERATION_REPLICATED_AFTER_THRESHOLD_EVENT = (
+        "s3:Replication:OperationReplicatedAfterThreshold"
+    )
+    OBJECT_RESTORE_DELETE_EVENT = "s3:ObjectRestore:Delete"
+    LIFECYCLE_TRANSITION_EVENT = "s3:LifecycleTransition"
+    INTELLIGENT_TIERING_EVENT = "s3:IntelligentTiering"
+    OBJECT_ACL_EVENT = "s3:ObjectAcl:Put"
+    LIFECYCLE_EXPIRATION_EVENT = "s3:LifecycleExpiration:*"
+    LIFECYCLEEXPIRATION_DELETE_EVENT = "s3:LifecycleExpiration:Delete"
+    LIFECYCLE_EXPIRATION_DELETE_MARKER_CREATED_EVENT = (
+        "s3:LifecycleExpiration:DeleteMarkerCreated"
+    )
+    OBJECT_TAGGING_EVENT = "s3:ObjectTagging:*"
+    OBJECT_TAGGING_PUT_EVENT = "s3:ObjectTagging:Put"
+    OBJECTTAGGING_DELETE_EVENT = "s3:ObjectTagging:Delete"
+
+    @classmethod
+    def events(self) -> List[str]:
+        return sorted([item.value for item in S3NotificationEvent])
 
 
 def _get_s3_event(
@@ -41,7 +83,9 @@ def _get_region_from_arn(arn: str) -> str:
     return arn.split(":")[3]
 
 
-def send_event(account_id: str, event_name: str, bucket: Any, key: Any) -> None:
+def send_event(
+    account_id: str, event_name: S3NotificationEvent, bucket: Any, key: Any
+) -> None:
     if bucket.notification_configuration is None:
         return
 
diff --git a/moto/s3/responses.py b/moto/s3/responses.py
index efde8dea1..8d666ebf1 100644
--- a/moto/s3/responses.py
+++ b/moto/s3/responses.py
@@ -63,6 +63,7 @@ from .models import (
     get_canned_acl,
     s3_backends,
 )
+from .notifications import S3NotificationEvent
 from .select_object_content import serialize_select
 from .utils import (
     ARCHIVE_STORAGE_CLASSES,
@@ -2113,18 +2114,6 @@ class S3Response(BaseResponse):
             ("CloudFunction", "lambda"),
         ]
 
-        event_names = [
-            "s3:ReducedRedundancyLostObject",
-            "s3:ObjectCreated:*",
-            "s3:ObjectCreated:Put",
-            "s3:ObjectCreated:Post",
-            "s3:ObjectCreated:Copy",
-            "s3:ObjectCreated:CompleteMultipartUpload",
-            "s3:ObjectRemoved:*",
-            "s3:ObjectRemoved:Delete",
-            "s3:ObjectRemoved:DeleteMarkerCreated",
-        ]
-
         found_notifications = (
             0  # Tripwire -- if this is not ever set, then there were no notifications
         )
@@ -2151,8 +2140,8 @@ class S3Response(BaseResponse):
                         n["Event"] = [n["Event"]]
 
                     for event in n["Event"]:
-                        if event not in event_names:
-                            raise InvalidNotificationEvent()
+                        if event not in S3NotificationEvent.events():
+                            raise InvalidNotificationEvent(event)
 
                     # Parse out the filters:
                     if n.get("Filter"):


Test patch:
diff --git a/tests/test_elbv2/test_elbv2.py b/tests/test_elbv2/test_elbv2.py
index cd933cb5a..4da6b059c 100644
--- a/tests/test_elbv2/test_elbv2.py
+++ b/tests/test_elbv2/test_elbv2.py
@@ -1291,6 +1291,28 @@ def test_modify_load_balancer_attributes_routing_http_drop_invalid_header_fields
     assert routing_http_drop_invalid_header_fields_enabled["Value"] == "false"
 
 
+@mock_elbv2
+@mock_ec2
+def test_modify_load_balancer_attributes_connection_logs_s3():
+    response, _, _, _, _, client = create_load_balancer()
+    arn = response["LoadBalancers"][0]["LoadBalancerArn"]
+
+    client.modify_load_balancer_attributes(
+        LoadBalancerArn=arn,
+        Attributes=[
+            {"Key": "connection_logs.s3.enabled", "Value": "true"},
+            {"Key": "connection_logs.s3.bucket", "Value": "s3bucket"},
+            {"Key": "connection_logs.s3.prefix", "Value": "test_prefix"},
+        ],
+    )
+
+    response = client.describe_load_balancer_attributes(LoadBalancerArn=arn)
+    attrs = client.describe_load_balancer_attributes(LoadBalancerArn=arn)["Attributes"]
+    assert {"Key": "connection_logs.s3.enabled", "Value": "true"} in attrs
+    assert {"Key": "connection_logs.s3.bucket", "Value": "s3bucket"} in attrs
+    assert {"Key": "connection_logs.s3.prefix", "Value": "test_prefix"} in attrs
+
+
 @mock_elbv2
 @mock_ec2
 @mock_acm
diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py
index f9deba6bc..6b6312355 100644
--- a/tests/test_s3/test_s3.py
+++ b/tests/test_s3/test_s3.py
@@ -2336,7 +2336,7 @@ def test_put_bucket_notification_errors():
     assert err.value.response["Error"]["Code"] == "InvalidArgument"
     assert (
         err.value.response["Error"]["Message"]
-        == "The event is not supported for notifications"
+        == "The event 'notarealeventname' is not supported for notifications. Supported events are as follows: ['s3:IntelligentTiering', 's3:LifecycleExpiration:*', 's3:LifecycleExpiration:Delete', 's3:LifecycleExpiration:DeleteMarkerCreated', 's3:LifecycleTransition', 's3:ObjectAcl:Put', 's3:ObjectCreated:*', 's3:ObjectCreated:CompleteMultipartUpload', 's3:ObjectCreated:Copy', 's3:ObjectCreated:Post', 's3:ObjectCreated:Put', 's3:ObjectRemoved:*', 's3:ObjectRemoved:Delete', 's3:ObjectRemoved:DeleteMarkerCreated', 's3:ObjectRestore:*', 's3:ObjectRestore:Completed', 's3:ObjectRestore:Delete', 's3:ObjectRestore:Post', 's3:ObjectTagging:*', 's3:ObjectTagging:Delete', 's3:ObjectTagging:Put', 's3:ReducedRedundancyLostObject', 's3:Replication:*', 's3:Replication:OperationFailedReplication', 's3:Replication:OperationMissedThreshold', 's3:Replication:OperationNotTracked', 's3:Replication:OperationReplicatedAfterThreshold']"
     )