Skip to content

Commit c842676

Browse files
committed
doc: added cos module example
1 parent d9ab8f2 commit c842676

File tree

1 file changed

+175
-2
lines changed

1 file changed

+175
-2
lines changed

docs/pulumi.md

Lines changed: 175 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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.
443445
So, 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)
467469
pulumi.export("plan_id", wxd.plan_id)
468470
pulumi.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

Comments
 (0)