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
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)
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)