def _add_custom_components(self, components, policy_statements,
                            components_resources):
     """Set custom component in imagebuilder cfn template."""
     initial_components_len = len(components)
     arn_components_len = 0
     for custom_component in self.config.build.components:
         custom_components_len = len(
             components) - initial_components_len - arn_components_len
         if custom_component.type == "arn":
             components.append(
                 imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                     component_arn=custom_component.value))
             arn_components_len += 1
         else:
             component_script_name = custom_component.value.split("/")[-1]
             component_id = "ScriptComponent" + str(custom_components_len)
             custom_component_resource = imagebuilder.CfnComponent(
                 self,
                 component_id,
                 name=self._build_resource_name(
                     IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                     "-Script-{0}".format(str(custom_components_len))),
                 version=utils.get_installed_version(
                     base_version_only=True),
                 description=
                 "This component is custom component for script, script name is {0}, script url is "
                 "{1}".format(component_script_name,
                              custom_component.value),
                 platform="Linux",
                 data=wrap_script_to_component(custom_component.value),
             )
             components.append(
                 imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                     component_arn=Fn.ref(component_id)))
             components_resources.append(custom_component_resource)
             if not self.custom_cleanup_lambda_role:
                 self._add_resource_delete_policy(
                     policy_statements,
                     ["imagebuilder:DeleteComponent"],
                     [
                         self.format_arn(
                             service="imagebuilder",
                             resource="component",
                             resource_name="{0}/*".format(
                                 self._build_resource_name(
                                     IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                                     "-Script-{0}".format(
                                         str(custom_components_len)),
                                     to_lower=True,
                                 )),
                         )
                     ],
                 )
    def _add_imagebuilder_components(self, build_tags,
                                     lambda_cleanup_policy_statements):
        imagebuilder_resources_dir = os.path.join(
            imagebuilder_utils.get_resources_directory(), "imagebuilder")

        # ImageBuilderComponents
        components = []
        components_resources = []
        if self.config.build and self.config.build.update_os_packages and self.config.build.update_os_packages.enabled:
            update_os_component_resource = imagebuilder.CfnComponent(
                self,
                "UpdateOSComponent",
                name=self._build_resource_name(
                    IMAGEBUILDER_RESOURCE_NAME_PREFIX + "-UpdateOS"),
                version=utils.get_installed_version(base_version_only=True),
                tags=build_tags,
                description="Update OS and Reboot",
                platform="Linux",
                data=Fn.sub(
                    _load_yaml(imagebuilder_resources_dir,
                               "update_and_reboot.yaml")),
            )
            components.append(
                imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                    component_arn=Fn.ref("UpdateOSComponent")))
            components_resources.append(update_os_component_resource)
            if not self.custom_cleanup_lambda_role:
                self._add_resource_delete_policy(
                    lambda_cleanup_policy_statements,
                    ["imagebuilder:DeleteComponent"],
                    [
                        self.format_arn(
                            service="imagebuilder",
                            resource="component",
                            resource_name="{0}/*".format(
                                self._build_resource_name(
                                    IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                                    "-UpdateOS",
                                    to_lower=True)),
                        )
                    ],
                )

        disable_pcluster_component = (
            self.config.dev_settings.disable_pcluster_component
            if self.config.dev_settings
            and self.config.dev_settings.disable_pcluster_component else False)
        if not disable_pcluster_component:
            parallelcluster_component_resource = imagebuilder.CfnComponent(
                self,
                "ParallelClusterComponent",
                name=self._build_resource_name(
                    IMAGEBUILDER_RESOURCE_NAME_PREFIX),
                version=utils.get_installed_version(base_version_only=True),
                tags=build_tags,
                description="Install ParallelCluster software stack",
                platform="Linux",
                data=Fn.sub(
                    _load_yaml(imagebuilder_resources_dir,
                               "parallelcluster.yaml")),
            )
            components.append(
                imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                    component_arn=Fn.ref("ParallelClusterComponent")))
            components_resources.append(parallelcluster_component_resource)
            if not self.custom_cleanup_lambda_role:
                self._add_resource_delete_policy(
                    lambda_cleanup_policy_statements,
                    ["imagebuilder:DeleteComponent"],
                    [
                        self.format_arn(
                            service="imagebuilder",
                            resource="component",
                            resource_name="{0}/*".format(
                                self._build_resource_name(
                                    IMAGEBUILDER_RESOURCE_NAME_PREFIX,
                                    to_lower=True)),
                        )
                    ],
                )

        tag_component_resource = imagebuilder.CfnComponent(
            self,
            "ParallelClusterTagComponent",
            name=self._build_resource_name(IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                                           "-Tag"),
            version=utils.get_installed_version(base_version_only=True),
            tags=build_tags,
            description="Tag ParallelCluster AMI",
            platform="Linux",
            data=_load_yaml(imagebuilder_resources_dir,
                            "parallelcluster_tag.yaml"),
        )
        components.append(
            imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                component_arn=Fn.ref("ParallelClusterTagComponent")))
        components_resources.append(tag_component_resource)
        if not self.custom_cleanup_lambda_role:
            self._add_resource_delete_policy(
                lambda_cleanup_policy_statements,
                ["imagebuilder:DeleteComponent"],
                [
                    self.format_arn(
                        service="imagebuilder",
                        resource="component",
                        resource_name="{0}/*".format(
                            self._build_resource_name(
                                IMAGEBUILDER_RESOURCE_NAME_PREFIX + "-Tag",
                                to_lower=True)),
                    )
                ],
            )

        if self.config.build.components:
            self._add_custom_components(components,
                                        lambda_cleanup_policy_statements,
                                        components_resources)

        disable_validate_and_test_component = (
            self.config.dev_settings.disable_validate_and_test
            if self.config.dev_settings
            and self.config.dev_settings.disable_validate_and_test else False)
        if not disable_pcluster_component and not disable_validate_and_test_component:
            validate_component_resource = imagebuilder.CfnComponent(
                self,
                id="ParallelClusterValidateComponent",
                name=self._build_resource_name(
                    IMAGEBUILDER_RESOURCE_NAME_PREFIX + "-Validate"),
                version=utils.get_installed_version(base_version_only=True),
                tags=build_tags,
                description="Validate ParallelCluster AMI",
                platform="Linux",
                data=_load_yaml(imagebuilder_resources_dir,
                                "parallelcluster_validate.yaml"),
            )
            components.append(
                imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                    component_arn=Fn.ref("ParallelClusterValidateComponent")))
            components_resources.append(validate_component_resource)
            if not self.custom_cleanup_lambda_role:
                self._add_resource_delete_policy(
                    lambda_cleanup_policy_statements,
                    ["imagebuilder:DeleteComponent"],
                    [
                        self.format_arn(
                            service="imagebuilder",
                            resource="component",
                            resource_name="{0}/*".format(
                                self._build_resource_name(
                                    IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                                    "-Validate",
                                    to_lower=True)),
                        )
                    ],
                )

            test_component_resource = imagebuilder.CfnComponent(
                self,
                id="ParallelClusterTestComponent",
                name=self._build_resource_name(
                    IMAGEBUILDER_RESOURCE_NAME_PREFIX + "-Test"),
                version=utils.get_installed_version(base_version_only=True),
                tags=build_tags,
                description="Test ParallelCluster AMI",
                platform="Linux",
                data=_load_yaml(imagebuilder_resources_dir,
                                "parallelcluster_test.yaml"),
            )
            components.append(
                imagebuilder.CfnImageRecipe.ComponentConfigurationProperty(
                    component_arn=Fn.ref("ParallelClusterTestComponent")))
            components_resources.append(test_component_resource)
            if not self.custom_cleanup_lambda_role:
                self._add_resource_delete_policy(
                    lambda_cleanup_policy_statements,
                    ["imagebuilder:DeleteComponent"],
                    [
                        self.format_arn(
                            service="imagebuilder",
                            resource="component",
                            resource_name="{0}/*".format(
                                self._build_resource_name(
                                    IMAGEBUILDER_RESOURCE_NAME_PREFIX +
                                    "-Test",
                                    to_lower=True)),
                        )
                    ],
                )

        return components, components_resources
示例#3
0
    def __init__(self, scope: core.Construct, id: str, bucket_name: str,
                 components_prefix: str, base_image_arn: str,
                 image_pipeline_name: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        bucket_uri = "s3://" + bucket_name + "/" + components_prefix

        # NOTE: when creating components, version number is supplied manually. If you update the components yaml and
        # need a new version deployed, version need to be updated manually.

        # spec to install python3
        component_python3_uri = bucket_uri + '/install_python3.yml'
        component_python3 = imagebuilder.CfnComponent(
            self,
            "component_python3",
            name="InstallPython3",
            platform="Linux",
            version="1.0.1",
            uri=component_python3_uri)

        # spec to install angular
        component_angular_uri = bucket_uri + '/install_angular.yml'
        component_angular = imagebuilder.CfnComponent(
            self,
            "component_angular",
            name="InstallAngular",
            platform="Linux",
            version="1.0.0",
            uri=component_angular_uri)

        # spec to install dotnet core
        component_dotnet_uri = bucket_uri + '/install_dotnetcore.yml'
        component_dotnet = imagebuilder.CfnComponent(self,
                                                     "component_dotnet",
                                                     name="InstallDotnetCore",
                                                     platform="Linux",
                                                     version="1.0.0",
                                                     uri=component_dotnet_uri)

        # spec to install docker and other dev tools
        component_devtools_uri = bucket_uri + '/install_devtools.yml'
        component_devtools = imagebuilder.CfnComponent(
            self,
            "component_devtools",
            name="InstallDevTools",
            platform="Linux",
            version="1.0.0",
            uri=component_devtools_uri)

        # recipe that installs all of above components together with a ubuntu base image
        recipe = imagebuilder.CfnImageRecipe(self,
                                             "UbuntuDevWorkstationRecipe",
                                             name="UbuntuDevWorkstationRecipe",
                                             version="1.0.3",
                                             components=[{
                                                 "componentArn":
                                                 component_python3.attr_arn
                                             }, {
                                                 "componentArn":
                                                 component_angular.attr_arn
                                             }, {
                                                 "componentArn":
                                                 component_dotnet.attr_arn
                                             }, {
                                                 "componentArn":
                                                 component_devtools.attr_arn
                                             }],
                                             parent_image=base_image_arn)

        # below role is assumed by ec2 instance
        role = iam.Role(self,
                        "UbuntuDevWorkstationRole",
                        role_name="UbuntuDevWorkstationRole",
                        assumed_by=iam.ServicePrincipal("ec2.amazonaws.com"))
        role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name(
                "AmazonSSMManagedInstanceCore"))
        role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name(
                "EC2InstanceProfileForImageBuilder"))

        # create an instance profile to attach the role
        instanceprofile = iam.CfnInstanceProfile(
            self,
            "UbuntuDevWorkstationInstanceProfile",
            instance_profile_name="UbuntuDevWorkstationInstanceProfile",
            roles=["UbuntuDevWorkstationRole"])

        # create infrastructure configuration to supply instance type
        infraconfig = imagebuilder.CfnInfrastructureConfiguration(
            self,
            "UbuntuDevWorkstationInfraConfig",
            name="UbuntuDevWorkstationInfraConfig",
            instance_types=["t3.xlarge"],
            instance_profile_name="UbuntuDevWorkstationInstanceProfile")

        # infrastructure need to wait for instance profile to complete before beginning deployment.
        infraconfig.add_depends_on(instanceprofile)

        # build the imagebuilder pipeline
        pipeline = imagebuilder.CfnImagePipeline(
            self,
            "UbuntuDevWorkstationPipeline",
            name=image_pipeline_name,
            image_recipe_arn=recipe.attr_arn,
            infrastructure_configuration_arn=infraconfig.attr_arn)

        pipeline.add_depends_on(infraconfig)
示例#4
0
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        cmp_chocoinstall = imagebuilder.CfnComponent(
            self,
            "cmp_chocoinstall",
            name="InstallChocolatey",
            platform="Windows",
            version="1.0.0",
            uri="s3://imagebuildercustomcomponents/installchoco.yml")

        rcp = imagebuilder.CfnImageRecipe(
            self,
            "WindowsImageSampleRecipe",
            name="WindowsImageSampleRecipe",
            version="1.0.0",
            components=[
                {
                    "componentArn":
                    "arn:aws:imagebuilder:eu-west-1:aws:component/dotnet-core-runtime-windows/3.1.0/1"
                },
                {
                    "componentArn": cmp_chocoinstall.attr_arn
                },
            ],
            parent_image=
            "arn:aws:imagebuilder:eu-west-1:aws:image/windows-server-2019-english-core-base-x86/2020.8.12"
        )

        role = iam.Role(self,
                        "WindowsImageSampleRole",
                        role_name="WindowsImageSampleRole",
                        assumed_by=iam.ServicePrincipal("ec2.amazonaws.com"))
        role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name(
                "AmazonSSMManagedInstanceCore"))
        role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name(
                "EC2InstanceProfileForImageBuilder"))

        instanceprofile = iam.CfnInstanceProfile(
            self,
            "WindowsImageSampleInstanceProfile",
            instance_profile_name="WindowsImageSampleInstanceProfile",
            roles=["WindowsImageSampleRole"])

        vpc = ec2.Vpc.from_lookup(self, "VPC", vpc_name="default")
        subnet = vpc.public_subnets[0]
        print("Subnet Id: " + subnet.subnet_id)

        sg = ec2.SecurityGroup.from_security_group_id(
            self, "SG", security_group_id="sg-54f65620")
        print("Security Group: " + sg.security_group_id)

        infraconfig = imagebuilder.CfnInfrastructureConfiguration(
            self,
            "WindowsImageSampleInfrastructureConfig",
            name="WindowsImageSampleInfrastructureConfig",
            instance_types=["t3.xlarge"],
            instance_profile_name="WindowsImageSampleInstanceProfile",
            subnet_id=subnet.subnet_id,
            security_group_ids=[sg.security_group_id])

        pipeline = imagebuilder.CfnImagePipeline(
            self,
            "WindowsImageSamplePipeline",
            name="WindowsImageSamplePipeline",
            image_recipe_arn=rcp.attr_arn,
            infrastructure_configuration_arn=infraconfig.attr_arn)