{"id":8157,"date":"2024-09-17T13:59:50","date_gmt":"2024-09-17T11:59:50","guid":{"rendered":"https:\/\/www.credativ.de\/?p=8157"},"modified":"2025-09-11T10:39:57","modified_gmt":"2025-09-11T08:39:57","slug":"master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp","status":"publish","type":"post","link":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/","title":{"rendered":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp"},"content":{"rendered":"<h3><strong>Mastering Cloud Infrastructure with Pulumi: Introduction<\/strong><\/h3>\n<p style=\"text-align: left;\">In today\u2019s rapidly changing landscape of cloud computing, managing infrastructure as code (IaC) has become essential for developers and IT professionals. Pulumi, an open-source IaC tool, brings a fresh perspective to the table by enabling infrastructure management using popular programming languages like JavaScript, TypeScript, Python, Go, and C#. This approach offers a unique blend of flexibility and power, allowing developers to leverage their existing coding skills to build, deploy, and manage cloud infrastructure. In this post, we\u2019ll explore the world of Pulumi and see how it pairs with Amazon FSx for NetApp ONTAP\u2014a robust solution for scalable and efficient cloud storage.<\/p>\n<hr \/>\n<h3><strong>Pulumi &#8211; The Theory<\/strong><\/h3>\n<h4>Why Pulumi?<\/h4>\n<p>Pulumi distinguishes itself among IaC tools for several compelling reasons:<\/p>\n<ul>\n<li><strong>Use Familiar Programming Languages<\/strong>: Unlike traditional IaC tools that rely on domain-specific languages (DSLs), Pulumi allows you to use familiar programming languages. This means no need to learn new syntax, and you can incorporate sophisticated logic, conditionals, and loops directly in your infrastructure code.<\/li>\n<li><strong>Seamless Integration with Development Workflows<\/strong>: Pulumi integrates effortlessly with existing development workflows and tools, making it a natural fit for modern software projects. Whether you&#8217;re managing a simple web app or a complex, multi-cloud architecture, Pulumi provides the flexibility to scale without sacrificing ease of use.<\/li>\n<\/ul>\n<h4>Challenges with Pulumi<\/h4>\n<p>Like any tool, Pulumi comes with its own set of challenges:<\/p>\n<ul>\n<li><strong>Learning Curve<\/strong>: While Pulumi leverages general-purpose languages, developers need to be proficient in the language they choose, such as Python or TypeScript. This can be a hurdle for those unfamiliar with these languages.<\/li>\n<li><strong>Growing Ecosystem<\/strong>: As a relatively new tool, Pulumi&#8217;s ecosystem is still expanding. It might not yet match the extensive plugin libraries of older IaC tools, but its vibrant and rapidly growing community is a promising sign of things to come.<\/li>\n<\/ul>\n<h4>State Management in Pulumi: Ensuring Consistency Across Deployments<\/h4>\n<p>Effective infrastructure management hinges on proper state handling. Pulumi excels in this area by tracking the state of your infrastructure, enabling it to manage resources efficiently. This capability ensures that Pulumi knows exactly what needs to be created, updated, or deleted during deployments. Pulumi offers several options for state storage:<\/p>\n<ul>\n<li><strong>Local State<\/strong>: Stored directly on your local file system. This option is ideal for individual projects or simple setups.<\/li>\n<li><strong>Remote State<\/strong>: By default, Pulumi stores state remotely on the Pulumi Service (a cloud-hosted platform provided by Pulumi), but it also allows you to configure storage on AWS S3, Azure Blob Storage, or Google Cloud Storage. This is particularly useful in team environments where collaboration is essential.<\/li>\n<\/ul>\n<p>Managing state effectively is crucial for maintaining consistency across deployments, especially in scenarios where multiple team members are working on the same infrastructure.<\/p>\n<h4>Other IaC Tools: Comparing Pulumi to Traditional IaC Tools<\/h4>\n<p>When comparing Pulumi to other Infrastructure as Code (IaC) tools, several drawbacks of traditional approaches become evident:<\/p>\n<ul>\n<li><strong>Domain-Specific Language (DSL) Limitations<\/strong>: Many IaC tools depend on DSLs, such as Terraform\u2019s HCL, requiring users to learn a specialized language specific to the tool.<\/li>\n<li><strong>YAML\/JSON Constraints<\/strong>: Tools that rely on YAML or JSON can be both restrictive and verbose, complicating the management of more complex configurations.<\/li>\n<li><strong>Steep Learning Curve<\/strong>: The necessity to master DSLs or particular configuration formats adds to the learning curve, especially for newcomers to IaC.<\/li>\n<li><strong>Limited Logical Capabilities<\/strong>: DSLs often lack support for advanced logic constructs such as loops, conditionals, and reusability. This limitation can lead to repetitive code that is challenging to maintain.<\/li>\n<li><strong>Narrow Ecosystem<\/strong>: Some IaC tools have a smaller ecosystem, offering fewer plugins, modules, and community-driven resources.<\/li>\n<li><strong>Challenges with Code Reusability<\/strong>: The inability to reuse code across different projects or components can hinder efficiency and scalability in infrastructure management.<\/li>\n<li><strong>Testing Complexity<\/strong>: Testing infrastructure configurations written in DSLs can be challenging, making it difficult to ensure the reliability and robustness of the infrastructure code.<\/li>\n<\/ul>\n<hr \/>\n<h3><strong>Pulumi &#8211; In Practice<\/strong><\/h3>\n<h4>Introduction<\/h4>\n<p>In the this section, we\u2019ll dive into a practical example to better understand Pulumi\u2019s capabilities. We\u2019ll also explore how to set up a project using Pulumi with AWS and automate it using GitHub Actions for CI\/CD.<\/p>\n<h4>Prerequisites<\/h4>\n<p>Before diving into using Pulumi with AWS and automating your infrastructure management through GitHub Actions, ensure you have the following prerequisites in place:<\/p>\n<ul>\n<li><strong>Pulumi CLI<\/strong>: Begin by installing the Pulumi CLI by following the official installation instructions. After installation, verify that Pulumi is correctly set up and accessible in your system&#8217;s <strong>PATH<\/strong> by running a quick version check.<\/li>\n<li><strong>AWS CLI<\/strong>: Install the AWS CLI, which is essential for interacting with AWS services. Configure the AWS CLI with your AWS credentials to ensure you have access to the necessary AWS resources. Ensure your AWS account is equipped with the required permissions, especially for IAM, EC2, S3, and any other AWS services you plan to manage with Pulumi.<\/li>\n<li><strong>AWS IAM User\/Role for GitHub Actions<\/strong>: Create a dedicated IAM user or role in AWS specifically for use in your GitHub Actions workflows. This user or role should have permissions necessary to manage the resources in your Pulumi stack. Store the <strong>AWS_ACCESS_KEY_ID<\/strong> and <strong>AWS_SECRET_ACCESS_KEY<\/strong> securely as secrets in your GitHub repository.<\/li>\n<li><strong>Pulumi Account<\/strong>: Set up a Pulumi account if you haven\u2019t already. Generate a Pulumi access token and store it as a secret in your GitHub repository to facilitate secure automation.<\/li>\n<li><strong>Python and Pip<\/strong>: Install Python (version 3.7 or higher is recommended) along with Pip, which are necessary for Pulumi&#8217;s Python SDK. Once Python is installed, proceed to install Pulumi\u2019s Python SDK along with any required AWS packages to enable infrastructure management through Python.<\/li>\n<li><strong>GitHub Account<\/strong>: Ensure you have an active GitHub account to host your code and manage your repository. Create a GitHub repository where you\u2019ll store your Pulumi project and related automation workflows. Store critical secrets like <strong>AWS_ACCESS_KEY_ID<\/strong>, <strong>AWS_SECRET_ACCESS_KEY<\/strong>, and your Pulumi access token securely in the GitHub repository\u2019s secrets section.<\/li>\n<li><strong>GitHub Runners<\/strong>: Utilize GitHub-hosted runners to execute your GitHub Actions workflows, or set up self-hosted runners if your project requires them. Confirm that the runners have all necessary tools installed, including Pulumi, AWS CLI, Python, and any other dependencies your Pulumi project might need.<\/li>\n<\/ul>\n<h4>Project Structure<\/h4>\n<p style=\"text-align: left;\">When working with Infrastructure as Code (IaC) using Pulumi, maintaining an organized project structure is essential. A clear and well-defined directory structure not only streamlines the development process but also improves collaboration and deployment efficiency. In this post, we&#8217;ll explore a typical directory structure for a Pulumi project and explain the significance of each component.<\/p>\n<h4 style=\"text-align: left;\">Overview of a Typical Pulumi Project Directory<\/h4>\n<p style=\"text-align: left;\">A standard Pulumi project might be organized as follows:<\/p>\n<pre><code class=\"language-bash\">\r\n\/project-root\r\n\u251c\u2500\u2500 .github\r\n\u2502 \u2514\u2500\u2500 workflows\r\n\u2502 \u2514\u2500\u2500 workflow.yml <strong># GitHub Actions workflow for CI\/CD<\/strong>\r\n\u251c\u2500\u2500 __main__.py <strong># Entry point for the Pulumi program<\/strong>\r\n\u251c\u2500\u2500 infra.py <strong># Infrastructure code<\/strong>\r\n\u251c\u2500\u2500 pulumi.dev.yml <strong># Pulumi configuration for the development environment<\/strong>\r\n\u251c\u2500\u2500 pulumi.prod.yml <strong># Pulumi configuration for the production environment<\/strong>\r\n\u251c\u2500\u2500 pulumi.yml<strong> # Pulumi configuration (common or default settings)<\/strong>\r\n\u251c\u2500\u2500 requirements.txt <strong># Python dependencies<\/strong>\r\n\u2514\u2500\u2500 test_infra.py <strong># Tests for infrastructure code<\/strong>\r\n<\/code><\/pre>\n<h4><strong>NetApp FSx on AWS<\/strong><\/h4>\n<h4>Introduction<\/h4>\n<p style=\"text-align: left;\">Amazon FSx for NetApp ONTAP offers a fully managed, scalable storage solution built on the NetApp ONTAP file system. It provides high-performance, highly available shared storage that seamlessly integrates with your AWS environment. Leveraging the advanced data management capabilities of ONTAP, FSx for NetApp ONTAP is ideal for applications needing robust storage features and compatibility with existing NetApp systems.<\/p>\n<h4>Key Features<\/h4>\n<ul>\n<li><strong>High Performance<\/strong>: FSx for ONTAP delivers low-latency storage designed to handle demanding, high-throughput workloads.<\/li>\n<li><strong>Scalability<\/strong>: Capable of scaling to support petabytes of storage, making it suitable for both small and large-scale applications.<\/li>\n<li><strong>Advanced Data Management<\/strong>: Leverages ONTAP\u2019s comprehensive data management features, including snapshots, cloning, and disaster recovery.<\/li>\n<li><strong>Multi-Protocol Access<\/strong>: Supports NFS and SMB protocols, providing flexible access options for a variety of clients.<\/li>\n<li><strong>Cost-Effectiveness<\/strong>: Implements tiering policies to automatically move less frequently accessed data to lower-cost storage, helping optimize storage expenses.<\/li>\n<\/ul>\n<h4>What It\u2019s About<\/h4>\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 whitespace-normal break-words [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"e0f173b7-2826-4b28-9f25-1c3774c37eec\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Setting up Pulumi for managing your cloud infrastructure can revolutionize the way you deploy and maintain resources. By leveraging familiar programming languages, Pulumi brings Infrastructure as Code (IaC) to life, making the process more intuitive and efficient. When paired with Amazon FSx for NetApp ONTAP, it unlocks advanced storage solutions within the AWS ecosystem.<\/p>\n<h4>Putting It All Together<\/h4>\n<p>Using Pulumi, you can define and deploy a comprehensive AWS infrastructure setup, seamlessly integrating the powerful FSx for NetApp ONTAP file system. This combination simplifies cloud resource management and ensures you harness the full potential of NetApp\u2019s advanced storage capabilities, making your cloud operations more efficient and robust.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>In the next sections, we&#8217;ll walk through the specifics of setting up each component using Pulumi code, illustrating how to create a VPC, configure subnets, set up a security group, and deploy an FSx for NetApp ONTAP file system, all while leveraging the robust features provided by both Pulumi and AWS.<\/p>\n<h4>Architecture Overview<\/h4>\n<p>A visual representation of the architecture we&#8217;ll deploy using Pulumi: Single AZ Deployment with FSx and EC2<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8158\" src=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png\" alt=\"\" width=\"602\" height=\"578\" srcset=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png 300w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-768x738.png 768w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-600x577.png 600w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-180x173.png 180w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio.png 781w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/p>\n<div>\n<p style=\"text-align: left;\">The diagram above illustrates the architecture for deploying an FSx for NetApp ONTAP file system within a single Availability Zone. The setup includes a VPC with public and private subnets, an Internet Gateway for outbound traffic, and a Security Group controlling access to the FSx file system and the EC2 instance. The EC2 instance is configured to mount the FSx volume using NFS, enabling seamless access to storage.<\/p>\n<\/div>\n<h4 style=\"text-align: left;\">Setting up Pulumi<\/h4>\n<p>Follow these steps to set up Pulumi and integrate it with AWS:<\/p>\n<p>Install Pulumi: Begin by installing Pulumi using the following command:<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/get.pulumi.com | sh<\/code><\/pre>\n<p>Install AWS CLI: If you haven\u2019t installed it yet, install the AWS CLI to manage AWS services:<\/p>\n<pre><code class=\"language-bash\">pip install awscli<\/code><\/pre>\n<p>Configure AWS CLI: Configure the AWS CLI with your credentials:<\/p>\n<pre><code class=\"language-bash\">aws configure<\/code><\/pre>\n<p>Create a New Pulumi Project: Initialize a new Pulumi project with AWS and Python:<\/p>\n<pre><code class=\"language-bash\">pulumi new aws-python<\/code><\/pre>\n<p>Configure Your Pulumi Stack: Set the AWS region for your Pulumi stack:<\/p>\n<pre><code class=\"language-bash\">pulumi config set aws:region eu-central-1<\/code><\/pre>\n<p>Deploy Your Stack: Deploy your infrastructure using Pulumi:<\/p>\n<pre><code class=\"language-bash\">pulumi preview ; pulumi up<\/code><\/pre>\n<h4 style=\"text-align: left;\">Example: VPC, Subnets, and FSx for NetApp ONTAP<\/h4>\n<p style=\"text-align: left;\">Let&#8217;s dive into an example Pulumi project that sets up a Virtual Private Cloud (VPC), subnets, a security group, an Amazon FSx for NetApp ONTAP file system, and an EC2 instance.<\/p>\n<h4>Pulumi Code Example: VPC, Subnets, and FSx for NetApp ONTAP<\/h4>\n<p>The first step is to define all the parameters required to set up the infrastructure. You can use the following example to configure these parameters as specified in the <strong>pulumi.dev.yaml<\/strong> file.<\/p>\n<p>This<strong> pulumi.dev.yaml<\/strong> file contains configuration settings for a Pulumi project. It specifies various parameters for the deployment environment, including the AWS region, availability zones, and key name. It also defines CIDR blocks for subnets.\u00a0These settings are used to configure and deploy cloud infrastructure resources in the specified AWS region.<\/p>\n<pre><code class=\"language-yaml\">\r\nconfig:\r\n  aws:region: eu-central-1\r\n  demo:availabilityZone: eu-central-1a\r\n  demo:keyName: XYZ\r\n  demo:subnet1CIDER: 10.0.3.0\/24\r\n  demo:subnet2CIDER: 10.0.4.0\/24\r\n<\/code><\/pre>\n<p style=\"text-align: left;\">The following code snippet should be placed in the<strong> infra.py<\/strong> file. It details the setup of the VPC, subnets, security group, and FSx for NetApp ONTAP file system. Each step in the code is explained through inline comments.<\/p>\n<pre><code class=\"language-python\">\r\nimport pulumi\r\nimport pulumi_aws as aws\r\nimport pulumi_command as command\r\nimport os\r\n\r\n<strong># Retrieve configuration values from Pulumi configuration files<\/strong>\r\naws_config = pulumi.Config(\"aws\")\r\nregion = aws_config.require(\"region\")  <strong># The AWS region where resources will be deployed<\/strong>\r\n\r\ndemo_config = pulumi.Config(\"demo\")\r\navailability_zone = demo_config.require(\"availabilityZone\")  <strong># Availability Zone for the deployment<\/strong>\r\nsubnet1_cidr = demo_config.require(\"subnet1CIDER\")  <strong># CIDR block for the public subnet<\/strong>\r\nsubnet2_cidr = demo_config.require(\"subnet2CIDER\")  <strong># CIDR block for the private subnet<\/strong>\r\nkey_name = demo_config.require(\"keyName\")  <strong># Name of the SSH key pair for EC2 instance access<\/strong><strong># Create a new VPC with DNS support enabled<\/strong>\r\nvpc = aws.ec2.Vpc(\r\n    \"fsxVpc\",\r\n    cidr_block=\"10.0.0.0\/16\",  <strong># VPC CIDR block<\/strong>\r\n    enable_dns_support=True,    <strong># Enable DNS support in the VPC<\/strong>\r\n    enable_dns_hostnames=True   <strong># Enable DNS hostnames in the VPC<\/strong>\r\n)\r\n\r\n<strong># Create an Internet Gateway to allow internet access from the VPC<\/strong>\r\ninternet_gateway = aws.ec2.InternetGateway(\r\n    \"vpcInternetGateway\",\r\n    vpc_id=vpc.id  <strong># Attach the Internet Gateway to the VPC<\/strong>\r\n)\r\n\r\n<strong># Create a public route table for routing internet traffic via the Internet Gateway<\/strong>\r\npublic_route_table = aws.ec2.RouteTable(\r\n    \"publicRouteTable\",\r\n    vpc_id=vpc.id,\r\n    routes=[aws.ec2.RouteTableRouteArgs(\r\n        cidr_block=\"0.0.0.0\/0\",  <strong># Route all traffic (0.0.0.0\/0) to the Internet Gateway<\/strong>\r\n        gateway_id=internet_gateway.id\r\n    )]\r\n)\r\n\r\n<strong># Create a single public subnet in the specified Availability Zone<\/strong>\r\npublic_subnet = aws.ec2.Subnet(\r\n    \"publicSubnet\",\r\n    vpc_id=vpc.id,\r\n    cidr_block=subnet1_cidr,  <strong># CIDR block for the public subnet<\/strong>\r\n    availability_zone=availability_zone,  <strong># The specified Availability Zone<\/strong>\r\n    map_public_ip_on_launch=True  <strong># Assign public IPs to instances launched in this subnet<\/strong>\r\n)\r\n\r\n<strong># Create a single private subnet in the same Availability Zone<\/strong>\r\nprivate_subnet = aws.ec2.Subnet(\r\n    \"privateSubnet\",\r\n    vpc_id=vpc.id,\r\n    cidr_block=subnet2_cidr,  <strong># CIDR block for the private subnet<\/strong>\r\n    availability_zone=availability_zone  <strong># The same Availability Zone<\/strong>\r\n)\r\n\r\n<strong># Associate the public subnet with the public route table to enable internet access<\/strong>\r\npublic_route_table_association = aws.ec2.RouteTableAssociation(\r\n    \"publicRouteTableAssociation\",\r\n    subnet_id=public_subnet.id,\r\n    route_table_id=public_route_table.id\r\n)\r\n\r\n<strong># Create a security group to control inbound and outbound traffic for the FSx file system<\/strong>\r\nsecurity_group = aws.ec2.SecurityGroup(\r\n    \"fsxSecurityGroup\",\r\n    vpc_id=vpc.id,\r\n    description=\"Allow NFS traffic\",  <strong># Description of the security group<\/strong>\r\n    ingress=[\r\n        aws.ec2.SecurityGroupIngressArgs(\r\n            protocol=\"tcp\",\r\n            from_port=2049,  <strong># NFS protocol port<\/strong>\r\n            to_port=2049,\r\n            cidr_blocks=[\"0.0.0.0\/0\"]  <strong># Allow NFS traffic from anywhere<\/strong>\r\n        ),\r\n        aws.ec2.SecurityGroupIngressArgs(\r\n            protocol=\"tcp\",\r\n            from_port=111,  <strong># RPCBind port for NFS<\/strong>\r\n            to_port=111,\r\n            cidr_blocks=[\"0.0.0.0\/0\"]  <strong># Allow RPCBind traffic from anywhere<\/strong>\r\n        ),\r\n        aws.ec2.SecurityGroupIngressArgs(\r\n            protocol=\"udp\",\r\n            from_port=111,  <strong># RPCBind port for NFS over UDP<\/strong>\r\n            to_port=111,\r\n            cidr_blocks=[\"0.0.0.0\/0\"]  <strong># Allow RPCBind traffic over UDP from anywhere<\/strong>\r\n        ),\r\n        aws.ec2.SecurityGroupIngressArgs(\r\n            protocol=\"tcp\",\r\n            from_port=22,  <strong># SSH port for EC2 instance access<\/strong>\r\n            to_port=22,\r\n            cidr_blocks=[\"0.0.0.0\/0\"]  <strong># Allow SSH traffic from anywhere<\/strong>\r\n        )\r\n    ],\r\n    egress=[\r\n        aws.ec2.SecurityGroupEgressArgs(\r\n            protocol=\"-1\",  <strong># Allow all outbound traffic<\/strong>\r\n            from_port=0,\r\n            to_port=0,\r\n            cidr_blocks=[\"0.0.0.0\/0\"]  <strong># Allow all outbound traffic to anywhere<\/strong>\r\n        )\r\n    ]\r\n)\r\n\r\n<strong># Create the FSx for NetApp ONTAP file system in the private subnet<\/strong>\r\nfile_system = aws.fsx.OntapFileSystem(\r\n    \"fsxFileSystem\",\r\n    subnet_ids=[private_subnet.id],  <strong># Deploy the FSx file system in the private subnet<\/strong>\r\n    preferred_subnet_id=private_subnet.id,  <strong># Preferred subnet for the FSx file system<\/strong>\r\n    security_group_ids=[security_group.id],  <strong># Attach the security group to the FSx file system<\/strong>\r\n    deployment_type=\"SINGLE_AZ_1\",  <strong># Single Availability Zone deployment<\/strong>\r\n    throughput_capacity=128,  <strong># Throughput capacity in MB\/s<\/strong>\r\n    storage_capacity=1024  <strong># Storage capacity in GB<\/strong>\r\n)\r\n\r\n<strong># Create a Storage Virtual Machine (SVM) within the FSx file system<\/strong>\r\nstorage_virtual_machine = aws.fsx.OntapStorageVirtualMachine(\r\n    \"storageVirtualMachine\",\r\n    file_system_id=file_system.id,  <strong># Associate the SVM with the FSx file system<\/strong>\r\n    name=\"svm1\",  <strong># Name of the SVM<\/strong>\r\n    root_volume_security_style=\"UNIX\"  <strong># Security style for the root volume<\/strong>\r\n)\r\n\r\n<strong># Create a volume within the Storage Virtual Machine (SVM)<\/strong>\r\nvolume = aws.fsx.OntapVolume(\r\n    \"fsxVolume\",\r\n    storage_virtual_machine_id=storage_virtual_machine.id,  <strong># Associate the volume with the SVM<\/strong>\r\n    name=\"vol1\",  <strong># Name of the volume<\/strong>\r\n    junction_path=\"\/vol1\",  <strong># Junction path for mounting<\/strong>\r\n    size_in_megabytes=10240,  <strong># Size of the volume in MB<\/strong>\r\n    storage_efficiency_enabled=True,  <strong># Enable storage efficiency features<\/strong>\r\n    tiering_policy=aws.fsx.OntapVolumeTieringPolicyArgs(\r\n        name=\"SNAPSHOT_ONLY\"  <strong># Tiering policy for the volume<\/strong>\r\n    ),\r\n    security_style=\"UNIX\"  <strong># Security style for the volume<\/strong>\r\n)\r\n\r\n<strong># Extract the DNS name from the list of SVM endpoints<\/strong>\r\ndns_name = storage_virtual_machine.endpoints.apply(lambda e: e[0]['nfs'][0]['dns_name'])\r\n\r\n<strong># Get the latest Amazon Linux 2 AMI for the EC2 instance<\/strong>\r\nami = aws.ec2.get_ami(\r\n    most_recent=True,\r\n    owners=[\"amazon\"],\r\n    filters=[{\"name\": \"name\", \"values\": [\"amzn2-ami-hvm-*-x86_64-gp2\"]}]  <strong># Filter for Amazon Linux 2 AMI<\/strong>\r\n)\r\n\r\n<strong># Create an EC2 instance in the public subnet<\/strong>\r\nec2_instance = aws.ec2.Instance(\r\n    \"fsxEc2Instance\",\r\n    instance_type=\"t3.micro\",  <strong># Instance type for the EC2 instance<\/strong>\r\n    vpc_security_group_ids=[security_group.id],  <strong># Attach the security group to the EC2 instance<\/strong>\r\n    subnet_id=public_subnet.id,  <strong># Deploy the EC2 instance in the public subnet<\/strong>\r\n    ami=ami.id,  <strong># Use the latest Amazon Linux 2 AMI<\/strong>\r\n    key_name=key_name,  <strong># SSH key pair for accessing the EC2 instance<\/strong>\r\n    tags={\"Name\": \"FSx EC2 Instance\"}  <strong># Tag for the EC2 instance<\/strong>\r\n)\r\n\r\n<strong># User data script to install NFS client and mount the FSx volume on the EC2 instance<\/strong>\r\nuser_data_script = dns_name.apply(lambda dns: f\"\"\"#!\/bin\/bash\r\nsudo yum update -y\r\nsudo yum install -y nfs-utils\r\nsudo mkdir -p \/mnt\/fsx\r\nif ! mountpoint -q \/mnt\/fsx; then\r\nsudo mount -t nfs {dns}:\/vol1 \/mnt\/fsx\r\nfi\r\n\"\"\")\r\n\r\n<strong># Retrieve the private key for SSH access from environment variables while running with Github Actions<\/strong>\r\nprivate_key_content = os.getenv(\"PRIVATE_KEY\")\r\nprint(private_key_content)\r\n\r\n<strong># Ensure the FSx file system is available before executing the script on the EC2 instance<\/strong>\r\npulumi.Output.all(file_system.id, ec2_instance.public_ip).apply(lambda args: command.remote.Command(\r\n    \"mountFsxFileSystem\",\r\n    connection=command.remote.ConnectionArgs(\r\n        host=args[1],\r\n        user=\"ec2-user\",\r\n        private_key=private_key_content\r\n    ),\r\n    create=user_data_script,\r\n    opts=pulumi.ResourceOptions(depends_on=[volume])\r\n))\r\n\r\n<\/code><code class=\"language-yaml\">\r\n<\/code><\/pre>\n<div class=\"flex-shrink-0 flex flex-col relative items-end\">\n<div>\n<div class=\"pt-0\">\n<div class=\"gizmo-bot-avatar flex h-8 w-8 items-center justify-center overflow-hidden rounded-full\">\n<h4 class=\"relative p-1 rounded-sm flex items-center justify-center bg-token-main-surface-primary text-token-text-primary h-8 w-8\"><strong>Pytest with Pulumi<\/strong><\/h4>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 whitespace-normal break-words [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"a05e6b8a-ae6c-4449-aa45-eda9f94ae109\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<h4>Introduction<\/h4>\n<p>Pytest is a widely-used Python testing framework that allows developers to create simple and scalable test cases. When paired with Pulumi, an infrastructure as code (IaC) tool, Pytest enables thorough testing of cloud infrastructure code, akin to application code testing. This combination is crucial for ensuring that infrastructure configurations are accurate, secure, and meet the required state before deployment. By using Pytest with Pulumi, you can validate resource properties, mock cloud provider responses, and simulate various scenarios. This reduces the risk of deploying faulty infrastructure and enhances the reliability of your cloud environments. Although integrating Pytest into your CI\/CD pipeline is not mandatory, it is highly beneficial as it leverages Python\u2019s robust testing capabilities with Pulumi.<\/p>\n<h4>Testing Code<\/h4>\n<p>The following code snippet should be placed in the<strong> infra_test.py <\/strong>file. It is designed to test the infrastructure setup defined in<strong> infra.py<\/strong>, including the VPC, subnets, security group, and FSx for NetApp ONTAP file system. Each test case focuses on different aspects of the infrastructure to ensure correctness, security, and that the desired state is achieved. Inline comments are provided to explain each test case.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-python\">\r\n# Importing necessary libraries\r\nimport pulumi\r\nimport pulumi_aws as aws\r\nfrom typing import Any, Dict, List\r\n\r\n# Setting up configuration values for AWS region and various parameters\r\npulumi.runtime.set_config('aws:region', 'eu-central-1')\r\npulumi.runtime.set_config('demo:availabilityZone1', 'eu-central-1a')\r\npulumi.runtime.set_config('demo:availabilityZone2', 'eu-central-1b')\r\npulumi.runtime.set_config('demo:subnet1CIDER', '10.0.3.0\/24')\r\npulumi.runtime.set_config('demo:subnet2CIDER', '10.0.4.0\/24')\r\npulumi.runtime.set_config('demo:keyName', 'XYZ') - Change based on your own key\r\n\r\n# Creating a class MyMocks to mock Pulumi's resources for testing\r\nclass MyMocks(pulumi.runtime.Mocks):\r\n    def new_resource(self, args: pulumi.runtime.MockResourceArgs) -&gt; List[Any]:\r\n        # Initialize outputs with the resource's inputs\r\n        outputs = args.inputs\r\n\r\n        # Mocking specific resources based on their type\r\n        if args.typ == \"aws:ec2\/instance:Instance\":\r\n            # Mocking an EC2 instance with some default values\r\n            outputs = {\r\n                **args.inputs,  # Start with the given inputs\r\n                \"ami\": \"ami-0eb1f3cdeeb8eed2a\",  # Mock AMI ID\r\n                \"availability_zone\": \"eu-central-1a\",  # Mock availability zone\r\n                \"publicIp\": \"203.0.113.12\",  # Mock public IP\r\n                \"publicDns\": \"ec2-203-0-113-12.compute-1.amazonaws.com\",  # Mock public DNS\r\n                \"user_data\": \"mock user data script\",  # Mock user data\r\n                \"tags\": {\"Name\": \"test\"}  # Mock tags\r\n            }\r\n        elif args.typ == \"aws:ec2\/securityGroup:SecurityGroup\":\r\n            # Mocking a Security Group with default ingress rules\r\n            outputs = {\r\n                **args.inputs,\r\n                \"ingress\": [\r\n                    {\"from_port\": 80, \"cidr_blocks\": [\"0.0.0.0\/0\"]},  # Allow HTTP traffic from anywhere\r\n                    {\"from_port\": 22, \"cidr_blocks\": [\"192.168.0.0\/16\"]}  # Allow SSH traffic from a specific CIDR block\r\n                ]\r\n            }\r\n        \r\n        # Returning a mocked resource ID and the output values\r\n        return [args.name + '_id', outputs]\r\n\r\n    def call(self, args: pulumi.runtime.MockCallArgs) -&gt; Dict[str, Any]:\r\n        # Mocking a call to get an AMI\r\n        if args.token == \"aws:ec2\/getAmi:getAmi\":\r\n            return {\r\n                \"architecture\": \"x86_64\",  # Mock architecture\r\n                \"id\": \"ami-0eb1f3cdeeb8eed2a\",  # Mock AMI ID\r\n            }\r\n        \r\n        # Return an empty dictionary if no specific mock is needed\r\n        return {}\r\n\r\n# Setting the custom mocks for Pulumi\r\npulumi.runtime.set_mocks(MyMocks())\r\n\r\n# Import the infrastructure to be tested\r\nimport infra\r\n\r\n# Define a test function to validate the AMI ID of the EC2 instance\r\n@pulumi.runtime.test\r\ndef test_instance_ami():\r\n    def check_ami(ami_id: str) -&gt; None:\r\n        print(f\"AMI ID received: {ami_id}\")\r\n        # Assertion to ensure the AMI ID is the expected one\r\n        assert ami_id == \"ami-0eb1f3cdeeb8eed2a\", 'EC2 instance must have the correct AMI ID'\r\n\r\n    # Running the test to check the AMI ID\r\n    pulumi.runtime.run_in_stack(lambda: infra.ec2_instance.ami.apply(check_ami))\r\n\r\n# Define a test function to validate the availability zone of the EC2 instance\r\n@pulumi.runtime.test\r\ndef test_instance_az():\r\n    def check_az(availability_zone: str) -&gt; None:\r\n        print(f\"Availability Zone received: {availability_zone}\")\r\n        # Assertion to ensure the instance is in the correct availability zone\r\n        assert availability_zone == \"eu-central-1a\", 'EC2 instance must be in the correct availability zone'\r\n    \r\n    # Running the test to check the availability zone\r\n    pulumi.runtime.run_in_stack(lambda: infra.ec2_instance.availability_zone.apply(check_az))\r\n\r\n# Define a test function to validate the tags of the EC2 instance\r\n@pulumi.runtime.test\r\ndef test_instance_tags():\r\n    def check_tags(tags: Dict[str, Any]) -&gt; None:\r\n        print(f\"Tags received: {tags}\")\r\n        # Assertions to ensure the instance has tags and a 'Name' tag\r\n        assert tags, 'EC2 instance must have tags'\r\n        assert 'Name' in tags, 'EC2 instance must have a Name tag'\r\n    \r\n    # Running the test to check the tags\r\n    pulumi.runtime.run_in_stack(lambda: infra.ec2_instance.tags.apply(check_tags))\r\n\r\n# Define a test function to validate the user data script of the EC2 instance\r\n@pulumi.runtime.test\r\ndef test_instance_userdata():\r\n    def check_user_data(user_data_script: str) -&gt; None:\r\n        print(f\"User data received: {user_data_script}\")\r\n        # Assertion to ensure the instance has user data configured\r\n        assert user_data_script is not None, 'EC2 instance must have user_data_script configured'\r\n    \r\n    # Running the test to check the user data script\r\n    pulumi.runtime.run_in_stack(lambda: infra.ec2_instance.user_data.apply(check_user_data))\r\n\r\n<\/code><\/pre>\n<h4><strong>Github Actions<\/strong><\/h4>\n<h4>Introduction<\/h4>\n<p>GitHub Actions is a powerful automation tool integrated within GitHub, enabling developers to automate their workflows, including testing, building, and deploying code. Pulumi, on the other hand, is an Infrastructure as Code (IaC) tool that allows you to manage cloud resources using familiar programming languages. In this post, we&#8217;ll explore why you should use GitHub Actions and its specific purpose when combined with Pulumi.<\/p>\n<h4>Why Use GitHub Actions and Its Importance<\/h4>\n<p>GitHub Actions is a powerful tool for automating workflows within your GitHub repository, offering several key benefits, especially when combined with Pulumi:<\/p>\n<ul>\n<li><strong>Integrated CI\/CD:<\/strong> GitHub Actions seamlessly integrates Continuous Integration and Continuous Deployment (CI\/CD) directly into your GitHub repository. This automation enhances consistency in testing, building, and deploying code, reducing the risk of manual errors.<\/li>\n<li><strong>Custom Workflows:<\/strong> It allows you to create custom workflows for different stages of your software development lifecycle, such as code linting, running unit tests, or managing complex deployment processes. This flexibility ensures your automation aligns with your specific needs.<\/li>\n<li><strong>Event-Driven Automation:<\/strong> You can trigger GitHub Actions with events like pushes, pull requests, or issue creation. This event-driven approach ensures that tasks are automated precisely when needed, streamlining your workflow.<\/li>\n<li><strong>Reusable Code:<\/strong> GitHub Actions supports reusable &#8220;actions&#8221; that can be shared across multiple workflows or repositories. This promotes code reuse and maintains consistency in automation processes.<\/li>\n<li><strong>Built-in Marketplace:<\/strong> The GitHub Marketplace offers a wide range of pre-built actions from the community, making it easy to integrate third-party services or implement common tasks without writing custom code.<\/li>\n<li><strong>Enhanced Collaboration:<\/strong> By using GitHub&#8217;s pull request and review workflows, teams can discuss and approve changes before deployment. This process reduces risks and improves collaboration on infrastructure changes.<\/li>\n<li><strong>Automated Deployment:<\/strong> GitHub Actions automates the deployment of infrastructure code, using Pulumi to apply changes. This automation reduces the risk of manual errors and ensures a consistent deployment process.<\/li>\n<li><strong>Testing:<\/strong> Running tests before deploying with GitHub Actions helps confirm that your infrastructure code works correctly, catching potential issues early and ensuring stability.<\/li>\n<li><strong>Configuration Management:<\/strong> It manages and sets up necessary configurations for Pulumi and AWS, ensuring your environment is correctly configured for deployments.<\/li>\n<li><strong>Preview and Apply Changes:<\/strong> GitHub Actions allows you to preview changes before applying them, helping you understand the impact of modifications and minimizing the risk of unintended changes.<\/li>\n<li><strong>Cleanup:<\/strong> You can optionally destroy the stack after testing or deployment, helping control costs and maintain a clean environment.<\/li>\n<\/ul>\n<h4>Execution<\/h4>\n<p>To execute the GitHub Actions workflow:<\/p>\n<ul>\n<li style=\"text-align: left;\"><strong>Placement:<\/strong> Save the workflow YAML file in your repository\u2019s <strong>.github\/workflows<\/strong> directory. This setup ensures that GitHub Actions will automatically detect and execute the workflow whenever there\u2019s a push to the <strong>main<\/strong> branch of your repository.<\/li>\n<li style=\"text-align: left;\"><strong>Workflow Actions:<\/strong> The workflow file performs several critical actions:\n<ul>\n<li><strong>Environment Setup:<\/strong> Configures the necessary environment for running the workflow.<\/li>\n<li><strong>Dependency Installation:<\/strong> Installs the required dependencies, including Pulumi CLI and other Python packages.<\/li>\n<li><strong>Testing:<\/strong> Runs your tests to verify that your infrastructure code functions as expected.<\/li>\n<li><strong>Preview and Apply Changes:<\/strong> Uses Pulumi to preview and apply any changes to your infrastructure.<\/li>\n<li><strong>Cleanup:<\/strong> Optionally destroys the stack after tests or deployment to manage costs and maintain a clean environment.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"text-align: left;\">By incorporating this workflow, you ensure that your Pulumi infrastructure is continuously integrated and deployed with proper validation, significantly improving the reliability and efficiency of your infrastructure management process.<\/p>\n<h4>Example: Deploy infrastructure with Pulumi<\/h4>\n<pre><code class=\"language-yaml\">\r\nname: Pulumi Deployment\r\n\r\non:\r\n  push:\r\n    branches:\r\n      - main\r\n\r\nenv:\r\n  <strong># Environment variables for AWS credentials and private key.<\/strong>\r\n  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\r\n  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\r\n  AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}\r\n  PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}\r\n\r\njobs:\r\n  pulumi-deploy:\r\n    runs-on: ubuntu-latest\r\n    environment: dev\r\n\r\n    steps:\r\n      - name: Checkout code\r\n        uses: actions\/checkout@v3\r\n        <strong># Check out the repository code to the runner.<\/strong>\r\n\r\n      - name: Configure AWS credentials\r\n        uses: aws-actions\/configure-aws-credentials@v3\r\n        with:\r\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\r\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\r\n          aws-region: eu-central-1\r\n        <strong># Set up AWS credentials for use in subsequent actions.<\/strong>\r\n\r\n      - name: Set up SSH key\r\n        run: |\r\n          mkdir -p ~\/.ssh\r\n          echo \"${{ secrets.SSH_PRIVATE_KEY }}\" &gt; ~\/.ssh\/XYZ.pem\r\n          chmod 600 ~\/.ssh\/XYZ.pem\r\n        <strong># Create an SSH directory, add the private SSH key, and set permissions.<\/strong>\r\n\r\n      - name: Set up Python\r\n        uses: actions\/setup-python@v4\r\n        with:\r\n          python-version: '3.9'\r\n        <strong># Set up Python 3.9 environment for running Python-based tasks.<\/strong>\r\n  \r\n      - name: Set up Node.js\r\n        uses: actions\/setup-node@v3\r\n        with:\r\n          node-version: '14'\r\n        <strong># Set up Node.js 14 environment for running Node.js-based tasks.<\/strong>\r\n\r\n      - name: Install project dependencies\r\n        run: npm install\r\n        working-directory: .\r\n        <strong># Install Node.js project dependencies specified in `package.json`.<\/strong>\r\n      \r\n      - name: Install Pulumi\r\n        run: npm install -g pulumi\r\n        <strong># Install the Pulumi CLI globally.<\/strong>\r\n\r\n      - name: Install dependencies\r\n        run: |\r\n          python -m pip install --upgrade pip\r\n          pip install -r requirements.txt\r\n        working-directory: .\r\n        <strong># Upgrade pip and install Python dependencies from `requirements.txt`.<\/strong>\r\n\r\n      - name: Login to Pulumi\r\n        run: pulumi login\r\n        env:\r\n          PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}\r\n        <strong># Log in to Pulumi using the access token stored in secrets.<\/strong>\r\n        \r\n      - name: Set Pulumi configuration for tests\r\n        run: pulumi config set aws:region eu-central-1 --stack dev\r\n        <strong># Set Pulumi configuration to specify AWS region for the `dev` stack.<\/strong>\r\n\r\n      - name: Pulumi stack select\r\n        run: pulumi stack select dev  \r\n        working-directory: .\r\n        <strong># Select the `dev` stack for Pulumi operations.<\/strong>\r\n\r\n      - name: Run tests\r\n        run: |\r\n          pulumi config set aws:region eu-central-1\r\n          pytest\r\n        working-directory: .\r\n        <strong># Set AWS region configuration and run tests using pytest.<\/strong>\r\n    \r\n      - name: Preview Pulumi changes\r\n        run: pulumi preview --stack dev\r\n        working-directory: .\r\n        <strong># Preview the changes that Pulumi will apply to the `dev` stack.<\/strong>\r\n    \r\n      - name: Update Pulumi stack\r\n        run: pulumi up --yes --stack dev\r\n        working-directory: . \r\n        <strong># Apply the changes to the `dev` stack with Pulumi.<\/strong>\r\n\r\n      - name: Pulumi stack output\r\n        run: pulumi stack output\r\n        working-directory: .\r\n        <strong># Retrieve and display outputs from the Pulumi stack.<\/strong>\r\n\r\n      - name: Cleanup Pulumi stack\r\n        run: pulumi destroy --yes --stack dev\r\n        working-directory: . \r\n        <strong># Destroy the `dev` stack to clean up resources.<\/strong>\r\n\r\n      - name: Pulumi stack output (after destroy)\r\n        run: pulumi stack output\r\n        working-directory: .\r\n        <strong># Retrieve and display outputs from the Pulumi stack after destruction.<\/strong>\r\n\r\n      - name: Logout from Pulumi\r\n        run: pulumi logout\r\n        <strong># Log out from the Pulumi session.<\/strong><\/code><\/pre>\n<div class=\"flex-shrink-0 flex flex-col relative items-end\">\n<div class=\"pt-0\">\n<div class=\"gizmo-bot-avatar flex h-8 w-8 items-center justify-center overflow-hidden rounded-full\">\n<div class=\"flex-shrink-0 flex flex-col relative items-end\">\n<div>\n<div class=\"pt-0\">\n<div class=\"gizmo-bot-avatar flex h-8 w-8 items-center justify-center overflow-hidden rounded-full\">\n<h4 class=\"relative p-1 rounded-sm flex items-center justify-center bg-token-main-surface-primary text-token-text-primary h-8 w-8\">Output:<\/h4>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 whitespace-normal break-words [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"2246f844-6a21-4df8-b8ed-785ff4510b0f\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Finally, let\u2019s take a look at how everything appears both in GitHub and in AWS. Check out the screenshots below to see the GitHub Actions workflow in action and the resulting AWS resources.<\/p>\n<div id=\"attachment_8225\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8225\" class=\"wp-image-8225 size-full\" src=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19.png\" alt=\"\" width=\"1402\" height=\"756\" srcset=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19.png 1402w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19-300x162.png 300w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19-1024x552.png 1024w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19-768x414.png 768w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19-600x324.png 600w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-02-19-180x97.png 180w\" sizes=\"auto, (max-width: 1402px) 100vw, 1402px\" \/><p id=\"caption-attachment-8225\" class=\"wp-caption-text\">GitHub Actions workflow<\/p><\/div>\n<div id=\"attachment_8221\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8221\" class=\"wp-image-8221 size-full\" src=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20.png\" alt=\"\" width=\"1796\" height=\"995\" srcset=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20.png 1796w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-300x166.png 300w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-1024x567.png 1024w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-768x425.png 768w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-1536x851.png 1536w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-600x332.png 600w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-20-180x100.png 180w\" sizes=\"auto, (max-width: 1796px) 100vw, 1796px\" \/><p id=\"caption-attachment-8221\" class=\"wp-caption-text\">AWS FSx resource<\/p><\/div>\n<div id=\"attachment_8223\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8223\" class=\"wp-image-8223 size-full\" src=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03.png\" alt=\"\" width=\"1796\" height=\"995\" srcset=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03.png 1796w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-300x166.png 300w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-1024x567.png 1024w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-768x425.png 768w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-1536x851.png 1536w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-600x332.png 600w, https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/Screenshot-from-2024-09-17-07-24-03-180x100.png 180w\" sizes=\"auto, (max-width: 1796px) 100vw, 1796px\" \/><p id=\"caption-attachment-8223\" class=\"wp-caption-text\">AWS FSx storage virtual machine<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 break-words [.text-message+&amp;]:mt-5 overflow-x-auto whitespace-normal\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"b10f0043-7825-45d3-bad5-fc790ffad265\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<hr \/>\n<h3><strong>Outlook: Exploring Advanced Features of Pulumi and Amazon FSx for NetApp ONTAP<\/strong><\/h3>\n<p>As you become more comfortable with Pulumi and Amazon FSx for NetApp ONTAP, there are numerous advanced features and capabilities to explore. These can significantly enhance your infrastructure automation and storage management strategies. In a follow-up blog post, we will delve into these advanced topics, providing a deeper understanding and practical examples.<\/p>\n<h4>Advanced Features of Pulumi<\/h4>\n<ol>\n<li style=\"text-align: left;\"><strong>Cross-Cloud Infrastructure Management<\/strong><br \/>\nPulumi supports multiple cloud providers, including AWS, Azure, Google Cloud, and Kubernetes. In more advanced scenarios, you can manage resources across different clouds in a single Pulumi project, enabling true multi-cloud and hybrid cloud architectures.<\/li>\n<li style=\"text-align: left;\"><strong>Component Resources<\/strong><br \/>\nPulumi allows you to create reusable components by grouping related resources into custom classes. This is particularly useful for complex deployments where you want to encapsulate and reuse configurations across different projects or environments.<\/li>\n<li style=\"text-align: left;\"><strong>Automation API<\/strong><br \/>\nPulumi\u2019s Automation API enables you to embed Pulumi within your own applications, allowing for infrastructure to be managed programmatically. This can be useful for building custom CI\/CD pipelines or integrating with other systems.<\/li>\n<li style=\"text-align: left;\"><strong>Policy as Code with Pulumi CrossGuard<\/strong><br \/>\nPulumi CrossGuard allows you to enforce compliance and security policies across your infrastructure using familiar programming languages. Policies can be applied to ensure that resources adhere to organizational standards, improving governance and reducing risk.<\/li>\n<li style=\"text-align: left;\"><strong>Stack References and Dependency Management<\/strong><br \/>\nPulumi&#8217;s stack references enable you to manage dependencies between different Pulumi stacks, allowing for complex, interdependent infrastructure setups. This is crucial for large-scale environments where components must interact and be updated in a coordinated manner.<\/li>\n<\/ol>\n<h4>Advanced Features of Amazon FSx for NetApp ONTAP<\/h4>\n<ol>\n<li style=\"text-align: left;\"><strong>Data Protection and Snapshots<\/strong><br \/>\nFSx for NetApp ONTAP offers advanced data protection features, including automated snapshots, SnapMirror for disaster recovery, and integration with AWS Backup. These features help safeguard your data and ensure business continuity.<\/li>\n<li style=\"text-align: left;\"><strong>Data Tiering and Cost Optimization<\/strong><br \/>\nFSx for ONTAP includes intelligent data tiering, which automatically moves infrequently accessed data to lower-cost storage. This feature is vital for optimizing costs, especially in environments with large amounts of data that have varying access patterns.<\/li>\n<li style=\"text-align: left;\"><strong>Multi-Protocol Access and CIFS\/SMB Integration<\/strong><br \/>\nFSx for ONTAP supports multiple protocols, including NFS, SMB, and iSCSI, enabling seamless access from both Linux\/Unix and Windows clients. This is particularly useful in mixed environments where applications or users need to access the same data using different protocols.<\/li>\n<li style=\"text-align: left;\"><strong>Performance Tuning and Quality of Service (QoS)<\/strong><br \/>\nFSx for ONTAP allows you to fine-tune performance parameters and implement QoS policies, ensuring that critical workloads receive the necessary resources. This is essential for applications with stringent performance requirements.<\/li>\n<li style=\"text-align: left;\"><strong>ONTAP System Manager and API Integration<\/strong><br \/>\nAdvanced users can leverage the ONTAP System Manager or integrate with NetApp&#8217;s extensive API offerings to automate and customize the management of FSx for ONTAP. This level of control is invaluable for organizations looking to tailor their storage solutions to specific needs.<\/li>\n<\/ol>\n<h4 style=\"text-align: left;\">What\u2019s Next?<\/h4>\n<p style=\"text-align: left;\">In the next blog post, we will explore these advanced features in detail, providing practical examples and use cases. We\u2019ll dive into multi-cloud management with Pulumi, demonstrate the creation of reusable infrastructure components, and explore how to enforce security and compliance policies with Pulumi CrossGuard. Additionally, we\u2019ll examine advanced data management strategies with FSx for NetApp ONTAP, including snapshots, data tiering, and performance optimization.<\/p>\n<p style=\"text-align: left;\">Stay tuned as we take your infrastructure as code and cloud storage management to the next level!<\/p>\n<h4 style=\"text-align: left;\">Conclusion<\/h4>\n<p style=\"text-align: left;\">This example demonstrates how Pulumi can be used to manage AWS infrastructure using Python. By defining resources like VPCs, subnets, security groups, and FSx file systems in code, you can version control your infrastructure and easily reproduce environments.<\/p>\n<p style=\"text-align: left;\">Amazon FSx for NetApp ONTAP offers a powerful and flexible solution for running file-based workloads in the cloud, combining the strengths of AWS and NetApp ONTAP. Pulumi&#8217;s ability to leverage existing programming languages for infrastructure management allows for more complex logic and better integration with your development workflows. However, it requires familiarity with these languages and has a smaller ecosystem compared to Terraform. Despite these differences, Pulumi is a powerful tool for managing modern cloud infrastructure.<\/p>\n<\/div>\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 break-words [.text-message+&amp;]:mt-5 overflow-x-auto whitespace-normal\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"1f2ae554-6d4e-40cf-a83a-ae89606cf5ac\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<hr \/>\n<h4><strong>Disclaimer<\/strong><\/h4>\n<p>The information provided in this blog post is for educational and informational purposes only. The features and capabilities of Pulumi and Amazon FSx for NetApp ONTAP mentioned are subject to change as new versions and updates are released. While we strive to ensure that the content is accurate and up-to-date, we cannot guarantee that it reflects the latest changes or improvements. Always refer to the official documentation and consult with your cloud provider or technology partner for the most current and relevant information. The author and publisher of this blog post are not responsible for any errors or omissions, or for any actions taken based on the information provided.<\/p>\n<h3>Suggested Links<\/h3>\n<ol>\n<li><strong>Pulumi Official Documentation<\/strong>: <a href=\"https:\/\/www.pulumi.com\/docs\/\" target=\"_new\" rel=\"noopener\">https:\/\/www.pulumi.com\/docs\/<\/a><\/li>\n<li><strong>Amazon FSx for NetApp ONTAP Documentation<\/strong>: <a href=\"https:\/\/docs.aws.amazon.com\/fsx\/latest\/ONTAPGuide\/what-is.html\" target=\"_new\" rel=\"noopener\">https:\/\/docs.aws.amazon.com\/fsx\/latest\/ONTAPGuide\/what-is.html<\/a><\/li>\n<li><strong>Pulumi GitHub Repository<\/strong>: <a href=\"https:\/\/github.com\/pulumi\/pulumi\" target=\"_new\" rel=\"noopener\">https:\/\/github.com\/pulumi\/pulumi<\/a><\/li>\n<li><strong>NetApp ONTAP Documentation<\/strong>: <a href=\"https:\/\/docs.netapp.com\/us-en\/ontap\/\" target=\"_new\" rel=\"noopener\">https:\/\/docs.netapp.com\/ontap\/index.jsp<\/a><\/li>\n<li><strong>AWS VPC Documentation:\u00a0<a href=\"https:\/\/docs.aws.amazon.com\/vpc\/\">https:\/\/docs.aws.amazon.com\/vpc\/<\/a><\/strong><\/li>\n<li><strong>AWS Security Group Documentation<\/strong>: <a href=\"https:\/\/docs.aws.amazon.com\/vpc\/latest\/userguide\/VPC_SecurityGroups.html\" target=\"_new\" rel=\"noopener\">https:\/\/docs.aws.amazon.com\/vpc\/latest\/userguide\/VPC_SecurityGroups.html<\/a><\/li>\n<li><strong>AWS EC2 Documentation<\/strong>: <a href=\"https:\/\/docs.aws.amazon.com\/ec2\/index.html\" target=\"_new\" rel=\"noopener\">https:\/\/docs.aws.amazon.com\/ec2\/index.html<\/a><\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div><\/div>\n<div class=\"items-center justify-start rounded-xl p-1 flex\"><em>This article was initially created by Harshil Gupta.<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<hr \/>\n","protected":false},"excerpt":{"rendered":"<p>Mastering Cloud Infrastructure with Pulumi: Introduction In today\u2019s rapidly changing landscape of cloud computing, managing infrastructure as code (IaC) has become essential for developers and IT professionals. Pulumi, an open-source IaC tool, brings a fresh perspective to the table by enabling infrastructure management using popular programming languages like JavaScript, TypeScript, Python, Go, and C#. This [&hellip;]<\/p>\n","protected":false},"author":90,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3,1885],"tags":[1973,1988,1981,1983,1975,1982,1989,1977,1979,1986,1976,1987,1991,1978,1974,1990,1972,1985,1984,1980],"class_list":["post-8157","post","type-post","status-publish","format-standard","hentry","category-credativ-inside","category-howtos-en","tag-amazon-fsx","tag-api-integration","tag-aws","tag-ci-cd-integration","tag-cloud-infrastructure","tag-cloud-optimization","tag-cloud-storage-solutions","tag-cross-cloud-management","tag-data-protection","tag-data-tiering","tag-infrastructure-as-code-iac","tag-infrastructure-automation","tag-infrastructure-testing","tag-multi-cloud-architectures","tag-netapp-ontap","tag-performance-tuning","tag-pulumi","tag-quality-of-service-qos","tag-security-policies","tag-storage-management"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp - credativ\u00ae<\/title>\n<meta name=\"description\" content=\"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp\" \/>\n<meta property=\"og:description\" content=\"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/\" \/>\n<meta property=\"og:site_name\" content=\"credativ\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/credativDE\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-17T11:59:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-11T08:39:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio.png\" \/>\n\t<meta property=\"og:image:width\" content=\"781\" \/>\n\t<meta property=\"og:image:height\" content=\"751\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"credativ Redaktion\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@credativde\" \/>\n<meta name=\"twitter:site\" content=\"@credativde\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"credativ Editorial Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/\"},\"author\":{\"name\":\"credativ Redaktion\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/63430ac9e022ccceba0f8d53ffe6db12\"},\"headline\":\"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp\",\"datePublished\":\"2024-09-17T11:59:50+00:00\",\"dateModified\":\"2025-09-11T08:39:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/\"},\"wordCount\":3478,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/netapp.drawio-300x288.png\",\"keywords\":[\"Amazon FSx\",\"API Integration\",\"AWS\",\"CI\\\/CD Integration\",\"Cloud Infrastructure\",\"Cloud Optimization\",\"Cloud Storage Solutions\",\"Cross-Cloud Management\",\"Data Protection\",\"Data Tiering\",\"Infrastructure as Code (IaC)\",\"Infrastructure Automation\",\"Infrastructure Testing\",\"Multi-Cloud Architectures\",\"NetApp ONTAP\",\"Performance Tuning\",\"Pulumi\",\"Quality of Service (QoS)\",\"Security Policies\",\"Storage Management\"],\"articleSection\":[\"credativ\u00ae Inside\",\"HowTos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#respond\"]}],\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/\",\"name\":\"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp - credativ\u00ae\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/netapp.drawio-300x288.png\",\"datePublished\":\"2024-09-17T11:59:50+00:00\",\"dateModified\":\"2025-09-11T08:39:57+00:00\",\"description\":\"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/netapp.drawio-300x288.png\",\"contentUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/netapp.drawio-300x288.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"name\":\"credativ GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\",\"name\":\"credativ\u00ae\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/credativDE\\\/\",\"https:\\\/\\\/x.com\\\/credativde\",\"https:\\\/\\\/mastodon.social\\\/@credativde\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/credativ-gmbh\",\"https:\\\/\\\/www.instagram.com\\\/credativ\\\/\"],\"description\":\"Die credativ GmbH ist ein f\u00fchrendes, auf Open Source Software spezialisiertes IT-Dienstleistungs- und Beratungsunternehmen. Wir bieten umfassende und professionelle Services, von Beratung und Infrastruktur-Betrieb \u00fcber 24\\\/7 Support bis hin zu individuellen L\u00f6sungen und Schulungen. Unser Fokus liegt auf dem ganzheitlichen Management von gesch\u00e4ftskritischen Open-Source-Systemen, darunter Betriebssysteme (z.B. Linux), Datenbanken (z.B. PostgreSQL), Konfigurationsmanagement (z.B. Ansible, Puppet) und Virtualisierung. Als engagierter Teil der Open-Source-Community unterst\u00fctzen wir unsere Kunden dabei, die Vorteile freier Software sicher, stabil und effizient in ihrer IT-Umgebung zu nutzen.\",\"legalName\":\"credativ GmbH\",\"foundingDate\":\"2025-03-01\",\"duns\":\"316387060\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"11\",\"maxValue\":\"50\"},\"address\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#local-main-place-address\"},\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":\"51.1732374\",\"longitude\":\"6.392010099999999\"},\"telephone\":[\"+4921619174200\",\"08002733284\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"telephone\":\"08002733284\",\"email\":\"vertrieb@credativ.de\"},\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\"],\"opens\":\"09:00\",\"closes\":\"17:00\"},{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"00:00\"}],\"email\":\"info@credativ.de\",\"areaServed\":\"D-A-CH\",\"vatID\":\"DE452151696\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/63430ac9e022ccceba0f8d53ffe6db12\",\"name\":\"credativ Redaktion\",\"description\":\"Dieser Account dient als Sammelpunkt f\u00fcr die wertvollen Beitr\u00e4ge ehemaliger Mitarbeiter von credativ. Wir bedanken uns f\u00fcr ihre gro\u00dfartigen Inhalte, die das technische Wissen in unserem Blog \u00fcber die Jahre hinweg bereichert haben. Ihre Artikel bleiben hier weiterhin f\u00fcr unsere Leser zug\u00e4nglich.\"},{\"@type\":\"PostalAddress\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#local-main-place-address\",\"streetAddress\":\"Hennes-Weisweiler-Allee 23\",\"addressLocality\":\"M\u00f6nchengladbach\",\"postalCode\":\"41179\",\"addressRegion\":\"Deutschland\",\"addressCountry\":\"DE\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/credativ-inside\\\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"contentUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"caption\":\"credativ\u00ae\"}]}<\/script>\n<meta name=\"geo.placename\" content=\"M\u00f6nchengladbach\" \/>\n<meta name=\"geo.position\" content=\"51.1732374;6.392010099999999\" \/>\n<meta name=\"geo.region\" content=\"Germany\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp - credativ\u00ae","description":"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/","og_locale":"en_US","og_type":"article","og_title":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp","og_description":"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.","og_url":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/","og_site_name":"credativ\u00ae","article_publisher":"https:\/\/www.facebook.com\/credativDE\/","article_published_time":"2024-09-17T11:59:50+00:00","article_modified_time":"2025-09-11T08:39:57+00:00","og_image":[{"width":781,"height":751,"url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio.png","type":"image\/png"}],"author":"credativ Redaktion","twitter_card":"summary_large_image","twitter_creator":"@credativde","twitter_site":"@credativde","twitter_misc":{"Written by":"credativ Editorial Team","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#article","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/"},"author":{"name":"credativ Redaktion","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/63430ac9e022ccceba0f8d53ffe6db12"},"headline":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp","datePublished":"2024-09-17T11:59:50+00:00","dateModified":"2025-09-11T08:39:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/"},"wordCount":3478,"commentCount":0,"publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png","keywords":["Amazon FSx","API Integration","AWS","CI\/CD Integration","Cloud Infrastructure","Cloud Optimization","Cloud Storage Solutions","Cross-Cloud Management","Data Protection","Data Tiering","Infrastructure as Code (IaC)","Infrastructure Automation","Infrastructure Testing","Multi-Cloud Architectures","NetApp ONTAP","Performance Tuning","Pulumi","Quality of Service (QoS)","Security Policies","Storage Management"],"articleSection":["credativ\u00ae Inside","HowTos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#respond"]}],"copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/www.credativ.de\/#organization"}},{"@type":"WebPage","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/","url":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/","name":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp - credativ\u00ae","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#primaryimage"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png","datePublished":"2024-09-17T11:59:50+00:00","dateModified":"2025-09-11T08:39:57+00:00","description":"Erfahren Sie, wie Pulumi on AWS Entwicklern hilft, Infrastruktur flexibel und effizient mit gewohnten Programmiersprachen zu verwalten.","breadcrumb":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#primaryimage","url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png","contentUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2024\/09\/netapp.drawio-300x288.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.credativ.de\/en\/"},{"@type":"ListItem","position":2,"name":"Master Pulumi with AWS Infrastructure and Amazon FSx for NetApp"}]},{"@type":"WebSite","@id":"https:\/\/www.credativ.de\/en\/#website","url":"https:\/\/www.credativ.de\/en\/","name":"credativ GmbH","description":"","publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.credativ.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Organization","Place"],"@id":"https:\/\/www.credativ.de\/en\/#organization","name":"credativ\u00ae","url":"https:\/\/www.credativ.de\/en\/","logo":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#local-main-organization-logo"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/credativDE\/","https:\/\/x.com\/credativde","https:\/\/mastodon.social\/@credativde","https:\/\/www.linkedin.com\/company\/credativ-gmbh","https:\/\/www.instagram.com\/credativ\/"],"description":"Die credativ GmbH ist ein f\u00fchrendes, auf Open Source Software spezialisiertes IT-Dienstleistungs- und Beratungsunternehmen. Wir bieten umfassende und professionelle Services, von Beratung und Infrastruktur-Betrieb \u00fcber 24\/7 Support bis hin zu individuellen L\u00f6sungen und Schulungen. Unser Fokus liegt auf dem ganzheitlichen Management von gesch\u00e4ftskritischen Open-Source-Systemen, darunter Betriebssysteme (z.B. Linux), Datenbanken (z.B. PostgreSQL), Konfigurationsmanagement (z.B. Ansible, Puppet) und Virtualisierung. Als engagierter Teil der Open-Source-Community unterst\u00fctzen wir unsere Kunden dabei, die Vorteile freier Software sicher, stabil und effizient in ihrer IT-Umgebung zu nutzen.","legalName":"credativ GmbH","foundingDate":"2025-03-01","duns":"316387060","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"11","maxValue":"50"},"address":{"@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#local-main-place-address"},"geo":{"@type":"GeoCoordinates","latitude":"51.1732374","longitude":"6.392010099999999"},"telephone":["+4921619174200","08002733284"],"contactPoint":{"@type":"ContactPoint","telephone":"08002733284","email":"vertrieb@credativ.de"},"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"17:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday"],"opens":"00:00","closes":"00:00"}],"email":"info@credativ.de","areaServed":"D-A-CH","vatID":"DE452151696"},{"@type":"Person","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/63430ac9e022ccceba0f8d53ffe6db12","name":"credativ Redaktion","description":"Dieser Account dient als Sammelpunkt f\u00fcr die wertvollen Beitr\u00e4ge ehemaliger Mitarbeiter von credativ. Wir bedanken uns f\u00fcr ihre gro\u00dfartigen Inhalte, die das technische Wissen in unserem Blog \u00fcber die Jahre hinweg bereichert haben. Ihre Artikel bleiben hier weiterhin f\u00fcr unsere Leser zug\u00e4nglich."},{"@type":"PostalAddress","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#local-main-place-address","streetAddress":"Hennes-Weisweiler-Allee 23","addressLocality":"M\u00f6nchengladbach","postalCode":"41179","addressRegion":"Deutschland","addressCountry":"DE"},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.credativ.de\/en\/blog\/credativ-inside\/master-pulumi-with-aws-infrastructure-and-amazon-fsx-for-netapp\/#local-main-organization-logo","url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","contentUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","caption":"credativ\u00ae"}]},"geo.placename":"M\u00f6nchengladbach","geo.position":{"lat":"51.1732374","long":"6.392010099999999"},"geo.region":"Germany"},"_links":{"self":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/8157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/users\/90"}],"replies":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/comments?post=8157"}],"version-history":[{"count":2,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/8157\/revisions"}],"predecessor-version":[{"id":9701,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/8157\/revisions\/9701"}],"wp:attachment":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/media?parent=8157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/categories?post=8157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/tags?post=8157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}