1- # IBM Cloud and Pulumi
1+ # Use your favorite programming language with Terraform IBM Modules and Pulumi
22
33[ Pulumi] ( https://www.pulumi.com/docs/iac/get-started/ ) is an open-source Infrastructure as Code (IaC) platform that lets you automate, secure, and manage cloud resources, configurations, and secrets — all using real programming languages like Python, Go, .NET, TypeScript, C# etc.
44
@@ -428,6 +428,8 @@ pulumi.export("ocp_cluster_id", cluster.id)
428428
429429<br/>
430430
431+ ### Terraform IBM Module examples
432+
431433<details>
432434<summary> Example 4: Use existing Terraform IBM Modules (TIM) to create Watson Discovery instance</summary>
433435<br/>
@@ -443,7 +445,7 @@ This will generate a local SDK which can be imported in the Pulumi program.
443445So, the Watson discovery package can be added as:
444446
445447```sh
446- pulumi package add terraform-module terraform-ibm-modules/watsonx-discovery/ibm v1 .11.1 wx-discovery
448+ pulumi package add terraform-module terraform-ibm-modules/watsonx-discovery/ibm 1 .11.1 wx_discovery
447449```
448450
449451```py
@@ -467,9 +469,180 @@ pulumi.export("crn", wxd.crn)
467469pulumi.export("plan_id", wxd.plan_id)
468470pulumi.export("dashboard_url", wxd.dashboard_url)
469471
472+ ```
473+
474+ </details>
475+
476+ <details>
477+ <summary> Example 5: Create Object Storage instance and buckets</summary>
470478
479+ <br/>
480+
481+ As shown in Example 4, a local SDK will be imported in the Pulumi program.
482+
483+ So, the cloud object storage module can be used as:
484+
485+ ```sh
486+ pulumi package add terraform-module terraform-ibm-modules/cos/ibm 10.1.14 ibm_cos_module
487+ pulumi package add terraform-module terraform-ibm-modules/resource-group/ibm 1.2.1 ibm_rg_module
471488```
472489
490+ ```py
491+ """A Python Pulumi program"""
492+
493+ import pulumi
494+ import pulumi_ibm_rg_module as rgmod
495+ import pulumi_ibm_cos_module as cosmod
496+ import pulumi_ibm as ibm
497+ import os
498+ import random
499+ import string
500+ import glob
501+ from pulumi_ibm import IamAccessGroup, IamAccessGroupPolicy
502+ from pulumi_ibm import CosBucketWebsiteConfiguration
503+
504+ REGION = "us-south"
505+ PREFIX = "pulumi2"
506+ API_KEY = os.getenv("IBMCLOUD_API_KEY")
507+
508+ # Set this to an existing resource group name to use it, or None to create a new one
509+ EXISTING_RESOURCE_GROUP = "Default" # or e.g. "Default"
510+
511+ # Resource Group
512+ if EXISTING_RESOURCE_GROUP:
513+ rg = rgmod.Module(
514+ "resource_group",
515+ existing_resource_group_name=EXISTING_RESOURCE_GROUP
516+ )
517+ resource_group_id = None # Will be looked up by name in COS module
518+ else:
519+ rg = rgmod.Module(
520+ "resource_group",
521+ resource_group_name=f"{PREFIX}-resource-group"
522+ )
523+ resource_group_id = rg.resource_group_id
524+
525+ # Random 4-character suffix for bucket name
526+ BUCKET_SUFFIX = ' ' .join(random.choices(string.ascii_lowercase + string.digits, k=4))
527+ BUCKET_NAME = f"{PREFIX}-web-bucket"
528+ COS_INSTANCE_NAME = f"{PREFIX}-cos"
529+
530+ # COS Instance and Bucket
531+ cos = cosmod.Module(
532+ "cos_instance_bucket",
533+ resource_group_id=rg.resource_group_id,
534+ region=REGION,
535+ cos_instance_name=COS_INSTANCE_NAME,
536+ bucket_name=BUCKET_NAME,
537+ create_cos_instance=True,
538+ create_cos_bucket=True,
539+ bucket_storage_class="standard",
540+ kms_encryption_enabled=False,
541+ retention_enabled=False,
542+ object_versioning_enabled=False,
543+ archive_days=None,
544+ expire_days=None,
545+ add_bucket_name_suffix=False # We already add our own
546+ )
547+
548+ # Upload files from static directory
549+ STATIC_DIR = os.path.join(os.path.dirname(__file__), "static")
550+ if os.path.isdir(STATIC_DIR):
551+ files = [os.path.basename(f) for f in glob.glob(os.path.join(STATIC_DIR, "*")) if os.path.isfile(f)]
552+ for fname in files:
553+ ibm.cos_bucket_object.CosBucketObject(
554+ f"file-{fname}",
555+ bucket_crn=cos.bucket_crn.apply(lambda crns: crns[0] if isinstance(crns, list) else crns),
556+ bucket_location=REGION,
557+ content_file=os.path.join(STATIC_DIR, fname),
558+ key=fname
559+ )
560+ else:
561+ pulumi.log.warn(f"Static directory not found: {STATIC_DIR}")
562+
563+ # Lookup the ' Public Access' IAM access group
564+ public_access_group = ibm.get_iam_access_group(
565+ access_group_name="Public Access"
566+ )
567+
568+ # Grant public read access to the bucket
569+ ibm.IamAccessGroupPolicy(
570+ "cos-public-access-policy",
571+ access_group_id=public_access_group.groups[0].id,
572+ roles=["Object Reader"],
573+ resources={
574+ "service": "cloud-object-storage",
575+ "resource_type": "bucket",
576+ "resource_instance_id": cos.cos_instance_guid.apply(lambda x: x[0] if isinstance(x, list) else x),
577+ "resource": cos.bucket_name.apply(lambda x: x[0] if isinstance(x, list) else x),
578+ }
579+ )
580+
581+ # Configure the COS bucket for static web hosting
582+ ibm.CosBucketWebsiteConfiguration(
583+ "website-config",
584+ bucket_crn=cos.bucket_crn.apply(lambda x: x[0] if isinstance(x, list) else x),
585+ bucket_location=REGION,
586+ website_configuration={
587+ "index_document": {"suffix": "index.html"},
588+ "error_document": {"key": "error.html"},
589+ }
590+ )
591+
592+ # Export outputs
593+ pulumi.export("bucket_name", cos.bucket_name)
594+ pulumi.export("cos_instance_name", cos.cos_instance_name)
595+ pulumi.export("website_endpoint", cos.bucket_crn.apply(lambda crn: f"https://{BUCKET_NAME}.s3.{REGION}.cloud-object-storage.appdomain.cloud"))
596+
597+ ```
598+
599+ <details>
600+ <summary> Sharing the `Pulumi.yaml` configuration for this example </summary>
601+ <br/>
602+
603+ ```yaml
604+ name: pulumi-start-ibmcloud
605+ description: A minimal IBM Cloud Python Pulumi program
606+ runtime:
607+ name: python
608+ options:
609+ toolchain: pip
610+ virtualenv: venv
611+ config:
612+ pulumi:tags:
613+ value:
614+ pulumi:template: python
615+ packages:
616+ ibm_cos_module:
617+ source: terraform-module
618+ version: 0.1.8
619+ parameters:
620+ - terraform-ibm-modules/cos/ibm
621+ - 10.1.14
622+ - ibm_cos_module
623+ ibm_rg_module:
624+ source: terraform-module
625+ version: 0.1.8
626+ parameters:
627+ - terraform-ibm-modules/resource-group/ibm
628+ - 1.2.1
629+ - ibm_rg_module
630+ ibm:
631+ source: terraform-provider
632+ version: 0.12.0
633+ parameters:
634+ - ibm-cloud/ibm
635+ ibm_cos_replication_module:
636+ source: terraform-module
637+ version: 0.1.8
638+ parameters:
639+ - terraform-ibm-modules/cos/ibm//examples/replication
640+ - 10.1.14
641+ - ibm_cos_replication_module
642+ ```
643+
644+ </details>
645+
473646</details>
474647
475648## Best Practices
0 commit comments