Skip to content

Commit

Permalink
Merge pull request #5 from aws-solutions/release_candidate/v1.1.2
Browse files Browse the repository at this point in the history
Release v1.1.2
  • Loading branch information
bassemwanis authored Jul 25, 2024
2 parents 841c590 + 49c87e5 commit 8a6a2e9
Show file tree
Hide file tree
Showing 22 changed files with 130 additions and 20 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.2] - 2024-07-25

### Added

- Support for new regions - China (Beijing), China (Ningxia), and GovCloud.

### Fixed

- Handling of case insensitivity of "Path" in ArchiveDescription Json parsing [#4](https://github.com/aws-solutions/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/pull/4).

## [1.1.1] - 2024-05-13

### Updated
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ generated using AWS CDK, for further information on CDK please refer to the

This solution collects anonymous operational metrics to help AWS improve the quality and features of the solution. For more information, including how to disable this capability, please see the [implementation guide](https://docs.aws.amazon.com/solutions/latest/instance-scheduler-on-aws/anonymized-data.html).


## External Contributors
[@diegokodify](https://github.com/diegokodify) for [#4](https://github.com/aws-solutions/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/pull/4).

---

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
Expand Down
2 changes: 1 addition & 1 deletion cdk.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"SOLUTION_NAME": "Data transfer from Amazon S3 Glacier vaults to Amazon S3",
"APP_REGISTRY_NAME": "data_retrieval_for_amazon_glacier_s3",
"SOLUTION_ID": "SO0293",
"SOLUTION_VERSION": "v1.1.1",
"SOLUTION_VERSION": "v1.1.2",
"APPLICATION_TYPE": "AWS-Solutions"
}
}
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ package-dir = {"" = "source"}

[project]
name = "solution"
version = "1.1.1"
version = "1.1.2"
description = "Data transfer from Amazon S3 Glacier vaults to Amazon S3"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion solution-manifest.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
id: SO0293 # Solution Id
name: data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3 # trademarked name
version: v1.1.1 # current version of the solution. Used to verify template headers
version: v1.1.2 # current version of the solution. Used to verify template headers
cloudformation_templates: # This list should match with AWS CloudFormation templates section of IG
- template: data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3.template
main_template: true
Expand Down
14 changes: 12 additions & 2 deletions source/solution/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@

import aws_cdk as cdk

from solution.infrastructure.aspects.app_registry import AppRegistry
from solution.infrastructure.aspects.app_registry import (
AppRegistry,
AppRegistryCondition,
)
from solution.infrastructure.stack import SolutionStack
from solution.mocking.mock_glacier_stack import MockGlacierStack
from solution.pipeline.stack import PipelineStack
Expand Down Expand Up @@ -41,14 +44,21 @@ def _load_cdk_context() -> Any:
return config.get("context", {})


def _setup_app_registry(app: cdk.App, stack: SolutionStack) -> None:
app_registry = AppRegistry(stack, "AppRegistryAspect")
app_registry_condition = AppRegistryCondition(stack, "AppRegistryConditionAspect")
cdk.Aspects.of(app_registry).add(app_registry_condition)
cdk.Aspects.of(app).add(app_registry)


def main() -> None:
app = cdk.App(context=_load_cdk_context())
solution_stack = SolutionStack(
app,
"data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3",
synthesizer=synthesizer,
)
cdk.Aspects.of(app).add(AppRegistry(solution_stack, "AppRegistryAspect"))
_setup_app_registry(app, solution_stack)
PipelineStack(app, "pipeline")
MockGlacierStack(app, "mock-glacier")
app.synth()
19 changes: 18 additions & 1 deletion source/solution/infrastructure/aspects/app_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,29 @@
from typing import Optional

import jsii
from aws_cdk import Aws, CfnResource, Fn, IAspect, Stack, Tags
from aws_cdk import Aws, CfnCondition, CfnResource, Fn, IAspect, Stack, Tags
from aws_cdk import aws_applicationinsights as applicationinsights
from aws_cdk import aws_servicecatalogappregistry_alpha as appreg
from constructs import Construct, IConstruct


@jsii.implements(IAspect)
class AppRegistryCondition(Construct):
def __init__(self, scope: Construct, id: str):
super().__init__(scope, id)
self.deploy_if_not_china_partition = CfnCondition(
self,
"DeployIfNotChinaPartition",
expression=Fn.condition_not(Fn.condition_equals(Aws.PARTITION, "aws-cn")),
)

def visit(self, node: IConstruct) -> None:
if isinstance(node, CfnResource):
node.add_override(
"Condition", self.deploy_if_not_china_partition.logical_id
)


@jsii.implements(IAspect)
class AppRegistry(Construct):
"""This construct creates the resources required for AppRegistry and injects them as Aspects"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def parse_description(archive_description: str) -> str:
if re.search(r"{\s*\\*\".*}\s*", archive_description):
try:
json_object = json.loads(archive_description)
path = json_object.get("Path")
path = json_object.get("Path") or json_object.get("path")
if isinstance(path, str):
return path
except Exception as _:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import boto3
from botocore.config import Config

__boto_config__ = Config(user_agent_extra="AwsSolution/SO0293/v1.1.1")
__boto_config__ = Config(user_agent_extra="AwsSolution/SO0293/v1.1.2")


def update_metric_table(
Expand Down
28 changes: 25 additions & 3 deletions source/solution/infrastructure/helpers/solutions_function.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""

import logging
from typing import Any
from typing import Any, Optional

import aws_cdk.aws_iam as iam
from aws_cdk import Aws, CfnCondition, Fn
Expand All @@ -14,14 +14,16 @@

from solution.application.util.exceptions import ResourceNotFound

DEFAULT_RUNTIME = Runtime.PYTHON_3_12
DEFAULT_RUNTIME = "python3.12"
GOV_CN_RUNTIME = "python3.11"


class SolutionsPythonFunction(Function):
def __init__(
self,
scope: Construct,
construct_id: str,
is_gov_cn_partition_condition: Optional[CfnCondition],
enable_x_ray_tracing: str,
**kwargs: Any,
):
Expand All @@ -33,15 +35,35 @@ def __init__(
kwargs["role"] = self._create_role()

# set runtime to Python 3.12 unless a runtime is passed
# GCR and GovCloud regions do not support Python 3.12
runtime = DEFAULT_RUNTIME
if is_gov_cn_partition_condition:
runtime = Fn.condition_if(
is_gov_cn_partition_condition.logical_id,
GOV_CN_RUNTIME,
DEFAULT_RUNTIME,
).to_string()
if not kwargs.get("runtime"):
kwargs["runtime"] = DEFAULT_RUNTIME
kwargs["runtime"] = Runtime(runtime)

# create default environment variable LOGGING_LEVEL
kwargs.setdefault("environment", {})["LOGGING_LEVEL"] = str(logging.INFO)

# initialize the parent Function
super().__init__(scope, construct_id, **kwargs)

# TODO: Remove the suppression once Python 3.12 is supported in GovCloud and GCD
# AwsSolutions-L1 threw an error during validation because the parameter references an intrinsic function.
NagSuppressions.add_resource_suppressions(
self,
[
{
"id": "CdkNagValidationFailure",
"reason": "Suppressing validation failure caused by intrinsic function in runtime.",
},
],
)

self._configure_x_ray_tracing(enable_x_ray_tracing)

def _create_role(self) -> iam.Role:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import boto3
from botocore.config import Config

__boto_config__ = Config(user_agent_extra="AwsSolution/SO0293/v1.1.1")
__boto_config__ = Config(user_agent_extra="AwsSolution/SO0293/v1.1.2")

s3_storage_class_mapping: Dict[str, str] = {
"S3 Glacier Deep Archive": "DEEP_ARCHIVE",
Expand Down
16 changes: 16 additions & 0 deletions source/solution/infrastructure/stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@

from aws_cdk import (
Aws,
CfnCondition,
CfnElement,
CfnOutput,
CfnParameter,
Duration,
Fn,
RemovalPolicy,
Stack,
StackSynthesizer,
Expand Down Expand Up @@ -90,6 +92,16 @@ def __init__(
default_retry=TaskRetry(),
)

# TODO: Remove this condition once Python 3.12 is supported in GovCloud and GCD
stack_info.cfn_conditions.is_gov_cn_partition_condition = CfnCondition(
self,
"GovCnCondition",
expression=Fn.condition_or(
Fn.condition_equals(Aws.PARTITION, "aws-us-gov"),
Fn.condition_equals(Aws.PARTITION, "aws-cn"),
),
)

notifications_dlq = sqs.DeadLetterQueue(
max_receive_count=10,
queue=sqs.Queue(
Expand Down Expand Up @@ -344,6 +356,7 @@ def __init__(
stack_info.lambdas.notifications_processor_lambda = SolutionsPythonFunction(
self,
"NotificationsProcessor",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.notifications_processor",
code=lambda_source,
Expand All @@ -368,6 +381,7 @@ def __init__(
stack_info.lambdas.completion_checker_lambda = SolutionsPythonFunction(
self,
"CompletionChecker",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.completion_checker",
code=lambda_source,
Expand Down Expand Up @@ -426,6 +440,7 @@ def __init__(
stack_info.lambdas.async_facilitator_lambda = SolutionsPythonFunction(
self,
"AsyncFacilitator",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.async_facilitator",
code=lambda_source,
Expand Down Expand Up @@ -476,6 +491,7 @@ def __init__(
stack_info.lambdas.metric_update_on_status_change_lambda = SolutionsPythonFunction(
self,
"MetricsProcessor",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.update_metric_on_status_change",
code=lambda_source,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.archives_needing_status_cleanup_lambda = SolutionsPythonFunction(
stack_info.scope,
"ArchivesNeedingStatusCleanup",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.archives_needing_status_cleanup",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -69,6 +70,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.cleanup_archives_status_lambda = SolutionsPythonFunction(
stack_info.scope,
"CleanupArchivesStatus",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.cleanup_archives_status_batch",
code=stack_info.lambda_source,
Expand Down
2 changes: 2 additions & 0 deletions source/solution/infrastructure/workflows/cleanup.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.post_workflow_dashboard_update = SolutionsPythonFunction(
stack_info.scope,
"PostWorkflowDashboardUpdate",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.post_workflow_dashboard_update",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -178,6 +179,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.cleanup_incomplete_multipart_uploads_lambda = SolutionsPythonFunction(
stack_info.scope,
"CleanupIncompleteMultipartUploads",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.cleanup_incomplete_multipart_uploads",
code=stack_info.lambda_source,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.archives_needing_window_extension_lambda = SolutionsPythonFunction(
stack_info.scope,
"ArchivesNeedingWindowExtension",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.archives_needing_window_extension",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -106,6 +107,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.extend_download_window_initiate_retrieval_lambda = SolutionsPythonFunction(
stack_info.scope,
"ExtendDownloadInitiateRetrieval",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.extend_archive_retrieval_batch",
code=stack_info.lambda_source,
Expand Down
8 changes: 7 additions & 1 deletion source/solution/infrastructure/workflows/get_inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.archive_naming_override_lambda = SolutionsPythonFunction(
stack_info.scope,
"ArchiveNamingOverride",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.archive_naming_overrides",
code=stack_info.lambda_source,
Expand All @@ -80,6 +81,7 @@ def __init__(self, stack_info: StackInfo):
SolutionsPythonFunction(
stack_info.scope,
"InitiateInventoryRetrieval",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.initiate_inventory_retrieval",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -248,6 +250,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.inventory_chunk_determination_lambda = SolutionsPythonFunction(
stack_info.scope,
"InventoryChunkDetermination",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.inventory_chunking",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -347,6 +350,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.inventory_retrieval_lambda_function = SolutionsPythonFunction(
stack_info.scope,
"InventoryChunkDownload",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.inventory_retrieval",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -448,6 +452,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.inventory_validation_lambda = SolutionsPythonFunction(
stack_info.scope,
"InventoryValidation",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.inventory_validation",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -517,6 +522,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.send_anonymized_stats_lambda = SolutionsPythonFunction(
stack_info.scope,
"SendAnonymizedStats",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.anonymized_stats",
code=stack_info.lambda_source,
Expand All @@ -528,7 +534,7 @@ def __init__(self, stack_info: StackInfo):
"ACCOUNT_ID": Aws.ACCOUNT_ID,
"REGION": Aws.REGION,
"VERSION": stack_info.scope.node.try_get_context("SOLUTION_VERSION")
or "v1.1.1",
or "v1.1.2",
"SOLUTION_ID": stack_info.scope.node.try_get_context("SOLUTION_ID")
or "SO0293",
"SEND_ANONYMIZED_STATISTICS": "Yes",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.initiate_archive_retrieval_lambda = SolutionsPythonFunction(
stack_info.scope,
"InitiateArchiveRetrieval",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.initiate_archive_retrieval_batch",
code=stack_info.lambda_source,
Expand Down Expand Up @@ -178,6 +179,7 @@ def __init__(self, stack_info: StackInfo):
stack_info.lambdas.calculate_timeout_lambda = SolutionsPythonFunction(
stack_info.scope,
"CalculateTimeout",
stack_info.cfn_conditions.is_gov_cn_partition_condition,
stack_info.parameters.enable_lambda_tracing_parameter.value_as_string,
handler="solution.application.handlers.initiation_timeout",
code=stack_info.lambda_source,
Expand Down
Loading

0 comments on commit 8a6a2e9

Please sign in to comment.