diff --git a/src/Answer.King.Api/Answer.King.Api.csproj b/src/Answer.King.Api/Answer.King.Api.csproj index 47eab26e..eaf9a5ef 100644 --- a/src/Answer.King.Api/Answer.King.Api.csproj +++ b/src/Answer.King.Api/Answer.King.Api.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/Answer.King.Api/packages.lock.json b/src/Answer.King.Api/packages.lock.json index 24663581..9a7143f6 100644 --- a/src/Answer.King.Api/packages.lock.json +++ b/src/Answer.King.Api/packages.lock.json @@ -27,11 +27,11 @@ }, "AWSSDK.CloudWatchLogs": { "type": "Direct", - "requested": "[3.7.104.33, )", - "resolved": "3.7.104.33", - "contentHash": "IkG8APzfnH54VfIC8qUwDuuotsOd8kJ4FlXuUspzr9JA6V1QkXTiNHvEfooNnMP5UlFMKLMea1lZbDs8zBDDTw==", + "requested": "[3.7.104.40, )", + "resolved": "3.7.104.40", + "contentHash": "KDl4kHFiTkjGwtU31dgUbhS/ouYRHk/qftZZs+SR3rnR4lQFduvRYN/zWUUppti6MC1XT6uA7JTbE7UzEqjrkQ==", "dependencies": { - "AWSSDK.Core": "[3.7.105.19, 4.0.0)" + "AWSSDK.Core": "[3.7.106.4, 4.0.0)" } }, "AWSSDK.Extensions.NETCore.Setup": { @@ -211,8 +211,8 @@ }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.105.19", - "contentHash": "RHSJu4gmQMvqGdxcNVNWglueXGFma+d6n3MUvWsMieosLbWvFq3TzCkeNF0Zmf69iUxNTHTWv+zoYNsFygZk+g==" + "resolved": "3.7.106.4", + "contentHash": "U+U7j0k5NxXXjjD9yxsVN5MjRpYlTSMyaDjLqwJaaeoFhycdkJ81t3Baret6VBwIGMmYpjAerk79vLAhvwU5Wg==" }, "FluentValidation": { "type": "Transitive", diff --git a/terraform/launch-config.tf b/terraform/launch-config.tf index 6c5b6c58..b6f55fae 100644 --- a/terraform/launch-config.tf +++ b/terraform/launch-config.tf @@ -27,6 +27,7 @@ data "template_file" "user_data" { resource "aws_launch_configuration" "ecs_launch_config" { #checkov:skip=CKV_AWS_79:TODO: Disable the Instance Metadata Service or enable it with proper configuration (v2) #checkov:skip=CKV_AWS_8:TODO: Encrypt volume in future security ticket + #checkov:skip=CKV_AWS_315:TODO: Look into aws autoscaling if necessary image_id = data.aws_ami.ecs_ami.id iam_instance_profile = aws_iam_instance_profile.ecs_instance_profile.name security_groups = [aws_security_group.ecs_sg.id] @@ -40,6 +41,7 @@ resource "aws_launch_configuration" "ecs_launch_config" { } resource "aws_autoscaling_group" "failure_analysis_ecs_asg" { + #checkov:skip=CKV_AWS_315:TODO: Look into aws autoscaling if necessary name = "${var.project_name}-auto-scaling-group" launch_configuration = aws_launch_configuration.ecs_launch_config.name vpc_zone_identifier = [ diff --git a/terraform/splunk/ec2/main.tf b/terraform/splunk/ec2/main.tf new file mode 100644 index 00000000..8789ef78 --- /dev/null +++ b/terraform/splunk/ec2/main.tf @@ -0,0 +1,92 @@ +terraform { + required_version = "~> 1.3" + + required_providers { + tls = { + source = "hashicorp/tls" + version = ">= 4.0.4" + } + } +} + +resource "aws_iam_instance_profile" "instance_profile" { + name = "${var.project_name}-ec2-monitoring-and-setup" + role = aws_iam_role.instance_role.name +} + +resource "aws_iam_role" "instance_role" { + name = "${var.project_name}-ec2-monitoring-and-setup" + assume_role_policy = <<-EOF + { + "Version": "2012-10-17", + "Statement": [ + { + "Action": ["sts:AssumeRole"], + "Effect": "Allow", + "Principal": { + "Service": ["ec2.amazonaws.com"] + } + } + ] + } + EOF +} + +resource "aws_iam_role_policy_attachment" "instance_role" { + for_each = toset([ + "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM", + "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" + ]) + role = aws_iam_role.instance_role.name + policy_arn = each.value +} + +resource "tls_private_key" "private_key" { + algorithm = "RSA" + rsa_bits = 4096 +} + +resource "aws_key_pair" "key_pair" { + key_name = "${var.project_name}-key-pair" + public_key = tls_private_key.private_key.public_key_openssh +} + +resource "aws_instance" "ec2" { + instance_type = var.ec2_instance_type + key_name = aws_key_pair.key_pair.key_name + ami = var.ami_id + metadata_options { + http_endpoint = "enabled" + http_tokens = "required" + } + root_block_device { + encrypted = true + } + + availability_zone = var.availability_zone + subnet_id = var.subnet_id + vpc_security_group_ids = var.vpc_security_group_ids + associate_public_ip_address = var.associate_public_ip_address + + iam_instance_profile = aws_iam_instance_profile.instance_profile.name + + user_data = var.user_data + user_data_replace_on_change = var.user_data_replace_on_change + + tags = { + Name = "${var.project_name}-ec2" + Owner = var.owner + } +} + +resource "aws_eip" "public_elastic_ip" { + count = var.needs_elastic_ip == true ? 1 : 0 + + instance = aws_instance.ec2.id + vpc = true + + tags = { + Name = "${var.project_name}-public-elastic-ip" + Owner = var.owner + } +} \ No newline at end of file diff --git a/terraform/splunk/ec2/output.tf b/terraform/splunk/ec2/output.tf new file mode 100644 index 00000000..2e3f0082 --- /dev/null +++ b/terraform/splunk/ec2/output.tf @@ -0,0 +1,9 @@ +output "instance_public_ip_address" { + value = aws_instance.ec2.public_ip + description = "This outputs the public IP associated with the EC2 instance. Note that this ouput will be the same as the elastic IP if `needs_elastic_ip` is set to `true`. This output is of type `string`." +} + +output "ec2_id" { + value = aws_instance.ec2.id + description = "This outputs the ID of the EC2 instance." +} \ No newline at end of file diff --git a/terraform/splunk/ec2/variables.tf b/terraform/splunk/ec2/variables.tf new file mode 100644 index 00000000..100dea0f --- /dev/null +++ b/terraform/splunk/ec2/variables.tf @@ -0,0 +1,65 @@ +/* + MANDATORY VARIABLES +*/ +variable "project_name" { + type = string + description = "This is used to label the resources of the module." +} + +variable "owner" { + type = string + description = "This is used to specify the owner of the resources in this module." +} + +variable "ami_id" { + type = string + description = "This is the id of the ami image used for the ec2 instance." +} + +variable "availability_zone" { + type = string + description = "This is the availability zone you want the ec2 instance to be created in." +} + +variable "subnet_id" { + type = string + description = "This is the id of the subnet you want the ec2 instance to be created in." +} + +variable "vpc_security_group_ids" { + type = list(string) + description = "This is a list of ids that specifies the security groups you want your EC2 to be in. If you do not wish to specify a security group for your module then please set this value to an empty list" +} + +/* + OPTIONAL VARIABLES +*/ +variable "ec2_instance_type" { + type = string + default = "t2.micro" + description = "This is the type of EC2 instance you want." +} + +variable "associate_public_ip_address" { + type = bool + default = true + description = "This is a boolean value indicating if a public IP address should be associated with the EC2 instance." +} + +variable "user_data" { + type = string + default = "" + description = "This allows bash scripts and command line commands to be specified and run in the EC2 instance when launched. Do not pass gzip-compressed data via this argument." +} + +variable "needs_elastic_ip" { + type = bool + default = false + description = "This is a boolean value indicating whether an elastic IP should be generated and associated with the EC2 instance." +} + +variable "user_data_replace_on_change" { + type = bool + default = true + description = "This value indicates whether changes to the `user_data` value triggers a rebuild of the EC2 instance." +} \ No newline at end of file diff --git a/terraform/splunk/splunk-backend.tf b/terraform/splunk/splunk-backend.tf new file mode 100644 index 00000000..4bafe80a --- /dev/null +++ b/terraform/splunk/splunk-backend.tf @@ -0,0 +1,51 @@ +terraform { + backend "s3" { + bucket = "answerking-splunk-terraform" + key = "answerking-splunk-terraform.tfstate" + region = "eu-west-2" + dynamodb_table = "answerking-splunk-terraform-state" + } +} + +/* +resource "aws_s3_bucket" "terraform_backend_bucket" { + bucket = "answerking-splunk-terraform" + + tags = { + Name = "answerking-splunk-terraform" + } +} + +resource "aws_s3_bucket_acl" "terraform_backend_bucket_acl" { + bucket = aws_s3_bucket.terraform_backend_bucket.id + acl = "private" +} + +resource "aws_s3_bucket_public_access_block" "terraform_backend_bucket_public_access_block" { + bucket = aws_s3_bucket.terraform_backend_bucket.id + + block_public_acls = true + block_public_policy = true + ignore_public_acls = true + restrict_public_buckets = true +} + +resource "aws_s3_bucket_versioning" "terraform_backend_bucket_versioning" { + bucket = aws_s3_bucket.terraform_backend_bucket.id + versioning_configuration { + status = "Enabled" + } +} + +resource "aws_dynamodb_table" "terraform_backend_state" { + name = "answerking-splunk-terraform-state" + read_capacity = 20 + write_capacity = 20 + hash_key = "LockID" + + attribute { + name = "LockID" + type = "S" + } +} +*/ \ No newline at end of file diff --git a/terraform/splunk/splunk-providers.tf b/terraform/splunk/splunk-providers.tf new file mode 100644 index 00000000..f38e2d2d --- /dev/null +++ b/terraform/splunk/splunk-providers.tf @@ -0,0 +1,5 @@ +#aws provider here +provider "aws" { + region = "eu-west-2" + skip_credentials_validation = true +} \ No newline at end of file diff --git a/terraform/splunk/splunk-variables.tf b/terraform/splunk/splunk-variables.tf new file mode 100644 index 00000000..ff01be8d --- /dev/null +++ b/terraform/splunk/splunk-variables.tf @@ -0,0 +1,23 @@ +variable "splunk_project_name" { + type = string + description = "Splunk Project Name" + default = "answerking-splunk-instance" +} + +variable "splunk_project_owner" { + type = string + description = "Splunk Resource Owner" + default = "answerking" +} + +variable "dns_base_domain_name" { + type = string + description = "DNS Base Domain Name" + default = "answerking.co.uk" +} + +variable "dns_splunk_domain_name" { + type = string + description = "Splunk Domain Name" + default = "splunk.answerking.co.uk" +} \ No newline at end of file diff --git a/terraform/splunk/splunk.tf b/terraform/splunk/splunk.tf new file mode 100644 index 00000000..dfb6f991 --- /dev/null +++ b/terraform/splunk/splunk.tf @@ -0,0 +1,325 @@ +module "splunk_vpc_subnet" { + source = "git::https://github.com/answerdigital/terraform-modules//Terraform_modules/vpc_subnets?ref=v1.0.0" + owner = var.splunk_project_owner + project_name = var.splunk_project_name + num_public_subnets = 2 + num_private_subnets = 0 +} + +data "aws_ami" "amazon_linux_2" { + most_recent = true + owners = ["amazon"] + + filter { + name = "name" + values = ["amzn2-ami-hvm-*-x86_64-ebs"] + } +} + +resource "aws_security_group" "ec2_sg" { + #checkov:skip=CKV_AWS_260:Allowing ingress from 0.0.0.0 for public HTTP(S) access + #checkov:skip=CKV2_AWS_5 + name = "${var.splunk_project_name}-ec2-sg" + description = "Security group for ec2_sg" + vpc_id = module.splunk_vpc_subnet.vpc_id + + ingress { + from_port = 8000 + to_port = 8089 + protocol = "tcp" + security_groups = [aws_security_group.lb_sg.id] + description = "Application Load Balancer" + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + description = "All traffic" + } + + tags = { + Name = "${var.splunk_project_name}-ec2-sg" + Owner = var.splunk_project_owner + } +} + +module "ec2_instance_setup" { + source = "git::https://github.com/answerdigital/terraform-modules//modules/aws/ec2?ref=v2" + project_name = var.splunk_project_name + owner = var.splunk_project_owner + ami_id = data.aws_ami.amazon_linux_2.id + availability_zone = module.splunk_vpc_subnet.az_zones[0] + subnet_id = module.splunk_vpc_subnet.public_subnet_ids[0] + vpc_security_group_ids = [aws_security_group.ec2_sg.id] + needs_elastic_ip = false + user_data_replace_on_change = true + associate_public_ip_address = false + user_data = < >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 +sudo yum update -y && yum upgrade -y +sudo amazon-linux-extras install docker -y +sudo service docker start +sudo docker pull splunk/splunk:latest +sudo docker run -d -p 8000:8000 -p 8089:8089 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=password" --name splunk splunk/splunk:latest +EOF +} + +# Route53 + +data "aws_route53_zone" "hosted_zone" { + name = var.dns_base_domain_name +} + +resource "aws_acm_certificate" "cert" { + domain_name = var.dns_splunk_domain_name + validation_method = "DNS" + + lifecycle { + create_before_destroy = true + } +} + +resource "aws_route53_record" "splunk" { + zone_id = data.aws_route53_zone.hosted_zone.zone_id + name = var.dns_splunk_domain_name + type = "CNAME" + set_identifier = "public_ip" + ttl = "60" + records = [aws_lb.lb.dns_name] + + geolocation_routing_policy { + country = "GB" + } +} + +# Load balancer + +resource "aws_security_group" "lb_sg" { + #checkov:skip=CKV_AWS_260:Allowing ingress from 0.0.0.0 for public HTTP(S) access + #checkov:skip=CKV2_AWS_5 + name = "${var.splunk_project_name}-lb-sg" + description = "Security group for lb-sg" + vpc_id = module.splunk_vpc_subnet.vpc_id + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + description = "HTTP" + } + + ingress { + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + description = "HTTPS" + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + description = "All traffic" + } + + tags = { + Name = "${var.splunk_project_name}-lb-sg" + Owner = var.splunk_project_owner + } +} + +resource "aws_lb" "lb" { + name = "${var.splunk_project_name}-lb" + internal = false + load_balancer_type = "application" + subnets = module.splunk_vpc_subnet.public_subnet_ids + drop_invalid_header_fields = true + security_groups = [aws_security_group.lb_sg.id] + enable_deletion_protection = true + + access_logs { + bucket = aws_s3_bucket.elb_logs.bucket + enabled = true + } + + tags = { + Name = "${var.splunk_project_name}-lb" + } +} + +resource "aws_lb_target_group" "target_group" { + name = "${var.splunk_project_name}-tg-${substr(uuid(), 0, 2)}" + port = 8000 + protocol = "HTTP" + target_type = "instance" + vpc_id = module.splunk_vpc_subnet.vpc_id + + health_check { + path = "/services/server/info" + protocol = "HTTP" + port = 8089 + matcher = "200" + interval = 15 + timeout = 3 + healthy_threshold = 2 + unhealthy_threshold = 2 + } + + + tags = { + Name = "${var.splunk_project_name}-lb-target-group" + } + + lifecycle { + create_before_destroy = true + ignore_changes = [name] + } +} + +resource "aws_lb_target_group_attachment" "target_group_attachment_ec2" { + target_group_arn = aws_lb_target_group.target_group.arn + target_id = module.ec2_instance_setup.instance_id + port = 8000 +} + +resource "aws_lb_listener" "lb_listener_http" { + load_balancer_arn = aws_lb.lb.arn + port = "80" + protocol = "HTTP" + + default_action { + type = "redirect" + + redirect { + port = "443" + protocol = "HTTPS" + status_code = "HTTP_301" + } + } +} + +resource "aws_lb_listener" "lb_listener_https" { + load_balancer_arn = aws_lb.lb.arn + port = "443" + protocol = "HTTPS" + ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" + certificate_arn = aws_acm_certificate.cert.arn + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.target_group.id + } + + tags = { + Name = "${var.splunk_project_name}-lb-listener" + Owner = var.splunk_project_owner + } +} + +# S3 logs +resource "aws_s3_bucket" "elb_logs" { + #checkov:skip=CKV2_AWS_62:TODO: event notifications not needed + #checkov:skip=CKV_AWS_145:TODO: encryption will be done in a future security update + #checkov:skip=CKV_AWS_144: cross-region replication not needed + #checkov:skip=CKV2_AWS_61: lifecycle configuration not needed + #checkov:skip=CKV_AWS_18: access logging not neeeded for this bucket + bucket = "${var.splunk_project_name}-lb-logs" + + tags = { + Name = "${var.splunk_project_name}-lb-logs" + Owner = var.splunk_project_owner + } +} + +resource "aws_s3_bucket_versioning" "version" { + bucket = aws_s3_bucket.elb_logs.id + + versioning_configuration { + status = "Enabled" + } +} + +data "aws_region" "current" {} +data "aws_caller_identity" "current" {} +data "aws_elb_service_account" "main" {} +resource "aws_s3_bucket_policy" "lb-bucket-policy" { + bucket = aws_s3_bucket.elb_logs.id + + policy = < - - + + diff --git a/tests/Answer.King.Api.IntegrationTests/packages.lock.json b/tests/Answer.King.Api.IntegrationTests/packages.lock.json index db125bdc..159eee91 100644 --- a/tests/Answer.King.Api.IntegrationTests/packages.lock.json +++ b/tests/Answer.King.Api.IntegrationTests/packages.lock.json @@ -4,9 +4,9 @@ "net7.0": { "Alba": { "type": "Direct", - "requested": "[7.3.0, )", - "resolved": "7.3.0", - "contentHash": "eO3xOfP9kzF+ZENdy+GZ3Xi7T+aqQkyNmm9fCNxFIFvXeAyPOheSVcGeUG3IpUZjVls9H1rzRfO6KZ0YjgUghQ==", + "requested": "[7.4.0, )", + "resolved": "7.4.0", + "contentHash": "t4xWNcAKTSgiF/6DqNMX5htqwyvAkFDIkm14v2mWnyPBjYgM3n66roQNv5kn2bN442NvRWvXO4iAg0trEqIX2g==", "dependencies": { "IdentityModel": "6.0.0", "Microsoft.AspNetCore.Authentication.JwtBearer": "7.0.0", @@ -21,11 +21,11 @@ }, "Microsoft.AspNetCore.Mvc.Testing": { "type": "Direct", - "requested": "[7.0.3, )", - "resolved": "7.0.3", - "contentHash": "uK3h+RhJHRDt+HEOty3LMDVJAWKucjpAdm2RKQR7QYQVAtRB9b3+Jl+9wGxlrqW5Den7Ut9RJlA+aO4nPceieQ==", + "requested": "[7.0.4, )", + "resolved": "7.0.4", + "contentHash": "Tb/CV2tvY8XlXZVD4SkV5++DoeHCuQwWlIQafgWeR2L1298PkNRF/DJhLdx+M2zXrKRAcMHZSrXXU0lBTaSEpg==", "dependencies": { - "Microsoft.AspNetCore.TestHost": "7.0.3", + "Microsoft.AspNetCore.TestHost": "7.0.4", "Microsoft.Extensions.DependencyModel": "7.0.0", "Microsoft.Extensions.Hosting": "7.0.1" } @@ -126,16 +126,16 @@ }, "AWSSDK.CloudWatchLogs": { "type": "Transitive", - "resolved": "3.7.104.33", - "contentHash": "IkG8APzfnH54VfIC8qUwDuuotsOd8kJ4FlXuUspzr9JA6V1QkXTiNHvEfooNnMP5UlFMKLMea1lZbDs8zBDDTw==", + "resolved": "3.7.104.40", + "contentHash": "KDl4kHFiTkjGwtU31dgUbhS/ouYRHk/qftZZs+SR3rnR4lQFduvRYN/zWUUppti6MC1XT6uA7JTbE7UzEqjrkQ==", "dependencies": { - "AWSSDK.Core": "[3.7.105.19, 4.0.0)" + "AWSSDK.Core": "[3.7.106.4, 4.0.0)" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.105.19", - "contentHash": "RHSJu4gmQMvqGdxcNVNWglueXGFma+d6n3MUvWsMieosLbWvFq3TzCkeNF0Zmf69iUxNTHTWv+zoYNsFygZk+g==" + "resolved": "3.7.106.4", + "contentHash": "U+U7j0k5NxXXjjD9yxsVN5MjRpYlTSMyaDjLqwJaaeoFhycdkJ81t3Baret6VBwIGMmYpjAerk79vLAhvwU5Wg==" }, "AWSSDK.Extensions.NETCore.Setup": { "type": "Transitive", @@ -205,8 +205,8 @@ }, "Microsoft.AspNetCore.TestHost": { "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "wS+gBqK8O6ASpGjEoRdxKR4qb/Hqt+RumM1bMfKxkjYpsBl4UMh8ClmXzU42omn3sWCpPqxZIBSIO3F4zEYPzQ==", + "resolved": "7.0.4", + "contentHash": "vL8iDF1I2EJ7PNEPcPuob+Z0FYYb0Fx/bRsxm1N/9Zy5F/UfsHnYdzI5Jurvsfzc6ceofvo5q0jbwrb4oHBLMg==", "dependencies": { "System.IO.Pipelines": "7.0.0" } @@ -1760,7 +1760,7 @@ "dependencies": { "AWS.Logger.AspNetCore": "[3.3.0, )", "AWS.Logger.SeriLog": "[3.2.0, )", - "AWSSDK.CloudWatchLogs": "[3.7.104.33, )", + "AWSSDK.CloudWatchLogs": "[3.7.104.40, )", "AWSSDK.Extensions.NETCore.Setup": "[3.7.5, )", "Answer.King.Domain": "[1.0.0, )", "Answer.King.Infrastructure": "[1.0.0, )", diff --git a/tests/Answer.King.Api.UnitTests/packages.lock.json b/tests/Answer.King.Api.UnitTests/packages.lock.json index af7a3273..f28810ba 100644 --- a/tests/Answer.King.Api.UnitTests/packages.lock.json +++ b/tests/Answer.King.Api.UnitTests/packages.lock.json @@ -84,16 +84,16 @@ }, "AWSSDK.CloudWatchLogs": { "type": "Transitive", - "resolved": "3.7.104.33", - "contentHash": "IkG8APzfnH54VfIC8qUwDuuotsOd8kJ4FlXuUspzr9JA6V1QkXTiNHvEfooNnMP5UlFMKLMea1lZbDs8zBDDTw==", + "resolved": "3.7.104.40", + "contentHash": "KDl4kHFiTkjGwtU31dgUbhS/ouYRHk/qftZZs+SR3rnR4lQFduvRYN/zWUUppti6MC1XT6uA7JTbE7UzEqjrkQ==", "dependencies": { - "AWSSDK.Core": "[3.7.105.19, 4.0.0)" + "AWSSDK.Core": "[3.7.106.4, 4.0.0)" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.105.19", - "contentHash": "RHSJu4gmQMvqGdxcNVNWglueXGFma+d6n3MUvWsMieosLbWvFq3TzCkeNF0Zmf69iUxNTHTWv+zoYNsFygZk+g==" + "resolved": "3.7.106.4", + "contentHash": "U+U7j0k5NxXXjjD9yxsVN5MjRpYlTSMyaDjLqwJaaeoFhycdkJ81t3Baret6VBwIGMmYpjAerk79vLAhvwU5Wg==" }, "AWSSDK.Extensions.NETCore.Setup": { "type": "Transitive", @@ -1449,7 +1449,7 @@ "dependencies": { "AWS.Logger.AspNetCore": "[3.3.0, )", "AWS.Logger.SeriLog": "[3.2.0, )", - "AWSSDK.CloudWatchLogs": "[3.7.104.33, )", + "AWSSDK.CloudWatchLogs": "[3.7.104.40, )", "AWSSDK.Extensions.NETCore.Setup": "[3.7.5, )", "Answer.King.Domain": "[1.0.0, )", "Answer.King.Infrastructure": "[1.0.0, )",