<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CormacHogan.com</title>
	<atom:link href="https://cormachogan.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://cormachogan.com/</link>
	<description>Storage, Data, Virtualization, Container Orchestration</description>
	<lastBuildDate>Thu, 15 Oct 2026 06:57:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/cormachogan.com/wp-content/uploads/2013/01/CH-Logo-tiny.jpg?fit=32%2C30&#038;ssl=1</url>
	<title>CormacHogan.com</title>
	<link>https://cormachogan.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">39287099</site>	<item>
		<title>Using the VCF CLI with CCI context to create Native Object Storage</title>
		<link>https://cormachogan.com/2026/10/14/using-the-vcf-cli-with-cci-context-to-create-native-object-storage/</link>
					<comments>https://cormachogan.com/2026/10/14/using-the-vcf-cli-with-cci-context-to-create-native-object-storage/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 13:00:50 +0000</pubDate>
				<category><![CDATA[Native Object Storage]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[VSAN]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[CCI]]></category>
		<category><![CDATA[Cloud Consumption Interface]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33283</guid>

					<description><![CDATA[<p>In a recent post, I demonstrated how you could use the VCF CLI with CCI context to manage VCFA provisioned databases integrated with VMware Data Services Manager. I thought it might be interesting to demonstrate a similar set of steps, but with the objective of creating a Native Object Store. Once again, the VCF Command Line Interface (CLI) would be used, pointing to a VCFA endpoint and using the Cloud Consumption Interface. This would enable us to work in the context of an organization user to make requests. In this post, I will show how to retrieve an API token,&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/10/14/using-the-vcf-cli-with-cci-context-to-create-native-object-storage/">Using the VCF CLI with CCI context to create Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" decoding="async" class="alignleft wp-image-33151 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?resize=198%2C224&#038;ssl=1" alt="" width="198" height="224" /></a>In a recent post, I demonstrated how you could <a href="https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/" target="_blank" rel="noopener">use the VCF CLI with CCI context to manage VCFA provisioned databases</a> integrated with VMware Data Services Manager. I thought it might be interesting to demonstrate a similar set of steps, but with the objective of creating a Native Object Store. Once again, the VCF Command Line Interface (CLI) would be used, pointing to a VCFA endpoint and using the Cloud Consumption Interface. This would enable us to work in the context of an organization user to make requests. In this post, I will show how to retrieve an API token, login to the CCI context using the VCF CLI, and demonstrate how to create an object store using kubectl command on a YAML manifest which describe the Native Object Store details.</p>
<p style="text-align: justify;"><em>Please note that Native Object Storage is still in <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/" target="_blank" rel="noopener">tech preview</a>, and is only available to some customers for testing. We hope to make it generally available to all our customers very soon.</em></p>
<h2>Get an API Token</h2>
<p style="text-align: justify;">Login to your VCF Automation Organization as a tenant admin. In the top right hand corner, open My Account under the User Settings view. From, there select API Tokens, then click on New to create a new token. Store this token somewhere safe.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" fetchpriority="high" decoding="async" class="aligncenter wp-image-33286 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=769%2C156&#038;ssl=1" alt="" width="769" height="156" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=1024%2C208&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=768%2C156&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=1536%2C311&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?resize=769%2C156&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Tokens.png?w=1618&amp;ssl=1 1618w" sizes="(max-width: 769px) 100vw, 769px" /></a></p>
<h2>Login to the CCI context</h2>
<p>With our token retrieve from VCF Automation, we can now login to the Cloud Consumption Interface, switch to the appropriate CCI context and query existing Object Stores using the VCF CLI. As you will see, I already have an existing Object Storage created via the UI.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>vcf config init</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Some initialization of the CLI is required.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Let's set things up for you.<span class="Apple-converted-space">  </span>This will just take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Initialization done!</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] ==</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] successfully initialized the config

</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>vcf context create tenant-01-cci-context \
--endpoint https://flt-auto01.rainpole.io --type cci \
--api-token Ifi3Pka7E01oJzyeL3ltbfEqzxbgj5av --insecure-skip-tls-verify</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">? Provide Tenant Name:<span class="Apple-converted-space">  </span><strong>tenant-01-org</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Successfully logged into flt-auto01.rainpole.io
</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">You have access to the following contexts:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">   </span>tenant-01-cci-context</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">   </span>tenant-01-cci-context:tenant-01-ns-wmgrf:default-project</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">If the namespace context you wish to use is not in this list, you may need to</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">refresh the context again, or contact your cluster administrator.</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">To change context, use `vcf context use &lt;context_name&gt;`</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] successfully saved context: tenant-01-cci-context</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] successfully saved context: tenant-01-cci-context:tenant-01-ns-wmgrf:default-project</span>


<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>vcf context use tenant-01-cci-context</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] Token is still active. Skipped the token refresh for context "tenant-01-cci-context"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Successfully activated context 'tenant-01-cci-context' (Type: cloud-consumption-interface)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[x] : failed to discover plugin sources from the system Harbor registry: unable to retrieve the complete list of server APIs: containerregistry.vmware.com/v1alpha1: no matches for containerregistry.vmware.com/v1alpha1, Resource=</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
$ <strong>kubectl get objectstores</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>REGION<span class="Apple-converted-space">        </span>VPC <span class="Apple-converted-space">                  </span>CAPACITY <span class="Apple-converted-space">  </span>PERFORMANCE CLASS <span class="Apple-converted-space">  </span>STATUS<span class="Apple-converted-space">    </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant1-oss <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>1Ti<span class="Apple-converted-space">        </span>Small <span class="Apple-converted-space">              </span>Healthy <span class="Apple-converted-space">  </span>14d</span></pre>
<h2>Build a YAML Manifest for an Object Store</h2>
<p style="text-align: justify;">We can use the VCF Automation to create a sample Object Storage YAML manifest which can then be applied via the CCI. Login to the VCFA organisation as your organisation admin user, select Build &amp; Deploy, then select Object Storage from the left-hand menu. Now select create a new object store, and populate the UI as normal. On the right-hand side, the Kubernetes Resource YAML for the Object Store is also populated as shown below.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?ssl=1"><img data-recalc-dims="1" decoding="async" class="aligncenter size-large wp-image-33287" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=769%2C544&#038;ssl=1" alt="" width="769" height="544" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=1024%2C725&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=300%2C212&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=768%2C544&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=1536%2C1088&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?resize=769%2C545&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/OSS-via-UI.png?w=1624&amp;ssl=1 1624w" sizes="(max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Note  that in the UI, the certificate provided must be a wildcard (e.g., *.rainpole.io) to cover the IAM and storage endpoints, as well as the OSE. However, if HTTPS is disabled implying HTTP access only, you can provide a single certificate for the storage endpoint, avoiding the use of wildcard certs. The single certificate must contain 2 Subject Alternate Names (SANs), one for the &lt;object-store-service-name&gt;.&lt;domain&gt; and another for storage-&lt;object-store-name&gt;.&lt;object-store-service-name&gt;.&lt;domain&gt;. The naming convention is very important. Here is an example taken from the <strong>openssl.cnf</strong> file used in my environment, where the object store name is set to np-test and object store service name is set to nos. This results in the following SANs.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="token punctuation">[</span><span class=""> alt_names </span><span class="token punctuation">]</span> </span>
<span class="token comment" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"># Subject Alternate Names for server_cert </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="">DNS.1 </span><span class="token operator">= nos</span><span class="">.rainpole.io </span></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="">DNS.2 </span><span class="token operator">=</span><span class=""> storage-np-test.nos.rainpole.io</span></span></pre>
<p style="text-align: justify;"><span class="">The first entry (nos.rainpole.io) is used as domain name </span><span class="token keyword">for</span><span class=""> the object store service. The second entry (storage-np-test.nos.rainpole.io) is used as the access endpoint FQDN </span><span class="token keyword">for</span><span class=""> S3 access. </span>Note that enableTLS is set to false in this manifest, so I do not need to provide a wildcard certificate. I only need to provide a valid certificate created with the two SANs mentioned previously for the storage endpoint, and of course, it must also include a private key. You can check the SAN entries are in the certificate by using the following openssl command:</p>
<pre class="p1"><span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;">% <strong>openssl x509 -in certs/ose-np-test.cert.pem -noout -text </strong></span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Certificate:</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>Data:</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Version: 3 (0x2)</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Serial Number: 4157 (0x103d)</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Signature Algorithm: sha256WithRSAEncryption</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Issuer: CN=CJH_CA, C=IE, ST=Cork, L=Cork, O=VCF Division, OU=OCTO, emailAddress=cormac.hogan@broadcom.com</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Validity</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>Not Before: Oct 14 07:09:15 2026 GMT</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>Not After : Oct 24 07:09:15 2027 GMT</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>Subject: C=IE, ST=Cork, O=VCF Division, OU=OCTO, CN=storage-np-test.nos.rainpole.io, emailAddress=cormac.hogan@broadcom.com</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        &lt;&lt;--snip--&gt;&gt;</span></span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">                </span>OpenSSL Generated Server Certificate</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>X509v3 Subject Key Identifier: </span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">                </span>F2:4E:A0:14:D0:A0:03:A6:05:D2:E2:F7:CF:99:DF:D6:3E:E3:BD:81</span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>X509v3 Subject Alternative Name: </span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">                </span><strong>DNS:nos.rainpole.io, DNS:storage-np-test.nos.rainpole.io</strong></span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>X509v3 Authority Key Identifier: </span>
<span class="s1" style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">                </span>keyid:85:5B:8C:EB:DE:31:79:69:29:80:A2:F2:38:78:AA:8E:7D:8A:33:3F</span></pre>
<p style="text-align: justify;">Here is an example of a YAML manifest, with the certificate and key entries truncated:</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">apiVersion: vsan.vmware.com/v1alpha1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">kind: ObjectStore</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">metadata:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>name: np-test</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">spec:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>capacity: 100Gi</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>cert: |</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>-----BEGIN CERTIFICATE-----</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>MIIGVzCCBD+gAwIBAgICEDwwDQYJKoZIhvcNAQELBQAwgYwxDzANBgNVBAMMBkNK
    ---&lt;SNIP&gt;---</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>eNOCCp4u9pkp1Tp02lspRXCY8Qo8H/gX/I0PT/ic4j5kXOBcS81zy7C38w==</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>-----END CERTIFICATE-----</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>enableTLS: false</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>key: |-</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>-----BEGIN PRIVATE KEY-----</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0CzYz0c2NCAQS</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    ---&lt;SNIP&gt;---
    </span>yvnT3LT9lYp1n/J8npzPMgnu</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>-----END PRIVATE KEY-----</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>performanceClass: Small</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>regionID: urn:vcloud:region:c86a2585-26a5-41cd-9ef5-c90887a6d637</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>regionName: cork-region</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>vpcName: default-cork-region</span>
</pre>
<p style="text-align: justify;">If you need to retrieve the list of regions and their regionID, you can get it by running the following commands:</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get regions</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">cork-region</span></pre>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$<strong> kubectl get regions cork-region -o yaml</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">apiVersion: topology.cci.vmware.com/v1alpha2</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">kind: Region</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">metadata:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>annotations: {}</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>finalizers: []</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>labels: {}</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>name: cork-region</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>ownerReferences: []</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>uid: c86a2585-26a5-41cd-9ef5-c90887a6d637</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">spec:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>description: ""</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">status:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>loadBalancerType: NSX_REGISTERED_AVI</span></pre>
<p style="text-align: justify;">Similarly, if you need to retrieve the name of the VPC, you can run the following:</p>
<pre class="p2"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get vpcs</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">                  </span>REGION<span class="Apple-converted-space">        </span>PRIVATE IPS <span class="Apple-converted-space">    </span>PROJECT <span class="Apple-converted-space">  </span>STATUS <span class="Apple-converted-space">    </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">default-cork-region <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>172.30.0.0/16 <span class="Apple-converted-space">  </span>&lt;none&gt;<span class="Apple-converted-space">    </span>Realized <span class="Apple-converted-space">  </span>36d</span></pre>
<p>You now have everything you need to deploy a Native Object Storage from the API.</p>
<h2>Apply the manifest, monitor the Object Storage creation</h2>
<p style="text-align: justify;">Now apply theYAML manifest created in the previous step. After applying the manifest, check the state of the object store. Note that in the example below, np-test is my new object store, whereas &#8220;tenant1-oss&#8221; is one that I previously created via the VCFA UI. Monitor the object stores from the CLI. It will change states from Init -&gt; Deploying -&gt; Degraded -&gt; Healthy over the course of a few minutes.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl apply -f tenant1-oss-np-test.yaml</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">objectstore.vsan.vmware.com/np-test created</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get objectstores</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>REGION<span class="Apple-converted-space">        </span>VPC <span class="Apple-converted-space">                  </span>CAPACITY <span class="Apple-converted-space">  </span>PERFORMANCE CLASS <span class="Apple-converted-space">  </span>STATUS<span class="Apple-converted-space">    </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">np-test <span class="Apple-converted-space">      </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>100Gi<span class="Apple-converted-space">      </span>Small <span class="Apple-converted-space">              </span><strong>Init</strong><span class="Apple-converted-space">      </span>60s</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant1-oss <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>1Ti<span class="Apple-converted-space">        </span>Small <span class="Apple-converted-space">              </span>Healthy <span class="Apple-converted-space">  </span>14d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get objectstores</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>REGION<span class="Apple-converted-space">        </span>VPC <span class="Apple-converted-space">                  </span>CAPACITY <span class="Apple-converted-space">  </span>PERFORMANCE CLASS <span class="Apple-converted-space">  </span>STATUS<span class="Apple-converted-space">      </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">np-test <span class="Apple-converted-space">      </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>100Gi<span class="Apple-converted-space">      </span>Small <span class="Apple-converted-space">              </span><strong>Deploying</strong> <span class="Apple-converted-space">  </span>96s</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant1-oss <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>1Ti<span class="Apple-converted-space">        </span>Small <span class="Apple-converted-space">              </span>Healthy <span class="Apple-converted-space">    </span>14d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get objectstores</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>REGION<span class="Apple-converted-space">        </span>VPC <span class="Apple-converted-space">                  </span>CAPACITY <span class="Apple-converted-space">  </span>PERFORMANCE CLASS <span class="Apple-converted-space">  </span>STATUS <span class="Apple-converted-space">    </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">np-test <span class="Apple-converted-space">      </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>100Gi<span class="Apple-converted-space">      </span>Small <span class="Apple-converted-space">              </span><strong>Degraded</strong> <span class="Apple-converted-space">  </span>4m10s</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant1-oss <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>1Ti<span class="Apple-converted-space">        </span>Small <span class="Apple-converted-space">              </span>Healthy<span class="Apple-converted-space">    </span>14d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>kubectl get objectstores</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>REGION<span class="Apple-converted-space">        </span>VPC <span class="Apple-converted-space">                  </span>CAPACITY <span class="Apple-converted-space">  </span>PERFORMANCE CLASS <span class="Apple-converted-space">  </span>STATUS<span class="Apple-converted-space">    </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">np-test <span class="Apple-converted-space">      </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>100Gi<span class="Apple-converted-space">      </span>Small <span class="Apple-converted-space">              </span><strong>Healthy</strong> <span class="Apple-converted-space">  </span>6m22s</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant1-oss <span class="Apple-converted-space">  </span>cork-region <span class="Apple-converted-space">  </span>default-cork-region <span class="Apple-converted-space">  </span>1Ti<span class="Apple-converted-space">        </span>Small <span class="Apple-converted-space">              </span>Healthy <span class="Apple-converted-space">  </span>14d</span></pre>
<p style="text-align: justify;">You can monitor the creation of the PodsVMs which back the object store via the vSphere Client. Navigate to the namespace which is created on behalf of the object store (it will have the name of the object store), select the Compute view and monitor as the PodVMs start up. Here is an example from my lab.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33300 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?resize=769%2C261&#038;ssl=1" alt="" width="769" height="261" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?resize=1024%2C347&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?resize=300%2C102&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?resize=768%2C260&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?resize=769%2C260&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-nos-podvms.png?w=1246&amp;ssl=1 1246w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Check the VCFA UI, tenant-01-org organization, and under Build &amp; Deploy &gt; Object Storage, your new object store should be visible. As per the CLI output previously, it should go through various states before eventually becoming Healthy.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33301 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?resize=769%2C165&#038;ssl=1" alt="" width="769" height="165" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?resize=1024%2C220&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?resize=300%2C65&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?resize=768%2C165&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?resize=769%2C166&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-nos-object-store.png?w=1403&amp;ssl=1 1403w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">The Object Store has been successfully deployed via the VCF CLI Cloud Consumption Interface. Note that the connections are now <em>http</em> rather than <em>https</em>, but that we were able to create this object store without the use of a wildcard certificate. Both the storage and the IAM are visible in the VCFA UI view of the object store. We can now drill down into the object store (as an org admin user) and <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/" target="_blank" rel="noopener">create buckets</a>, <a href="https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/" target="_blank" rel="noopener">user credentials</a> and <a href="https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/" target="_blank" rel="noopener">bucket policies</a> on our object store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33302 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?resize=769%2C361&#038;ssl=1" alt="" width="769" height="361" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?resize=1024%2C481&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?resize=300%2C141&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?resize=768%2C361&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?resize=769%2C361&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-nos-bucket-create.png?w=1409&amp;ssl=1 1409w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Summary</h2>
<p style="text-align: justify;">Object Storage is available via the VCF Automation Cloud Consumption Interface (CCI). Customers can manage Native Object Stores via the Kubernetes kubectl command line tool once a context is created. Even better, there is an option to avoid the use of wildcards in certificates for customers who are not in a position to use them in VCF 9.1.1 tech preview. The plan is to address this fully through both API and UI in time for GA.</p>
<p>The post <a href="https://cormachogan.com/2026/10/14/using-the-vcf-cli-with-cci-context-to-create-native-object-storage/">Using the VCF CLI with CCI context to create Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/10/14/using-the-vcf-cli-with-cci-context-to-create-native-object-storage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33283</post-id>	</item>
		<item>
		<title>Native Object Storage Use-Cases</title>
		<link>https://cormachogan.com/2026/10/06/native-object-storage-use-cases/</link>
					<comments>https://cormachogan.com/2026/10/06/native-object-storage-use-cases/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 13:00:43 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[Native Object Storage]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[Velero]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[VSAN]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[vSphere Kubernetes Service (VKS)]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[DSM]]></category>
		<category><![CDATA[Greenplum]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<category><![CDATA[VKS]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33257</guid>

					<description><![CDATA[<p>While there are many use-cases for object storage, I wanted to create a short post to highlight some of the use-cases that I have been trying out in my own lab. Two of the use cases are for backup and logs, and another is as an S3 Foreign Data Wrapper (FDW) for Greenplum databases. In the first use-case, I will show you how to configure an S3 bucket for both VMware Data Services Manager (DSM) backups and logs, both for the databases and the provider appliance itself. In a second backup use-case, I will show how you can configure a&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/10/06/native-object-storage-use-cases/">Native Object Storage Use-Cases</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class=" wp-image-33151 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?resize=150%2C170&#038;ssl=1" alt="" width="150" height="170" /></a>While there are many use-cases for object storage, I wanted to create a short post to highlight some of the use-cases that I have been trying out in my own lab. Two of the use cases are for backup and logs, and another is as an S3 Foreign Data Wrapper (FDW) for Greenplum databases. In the first use-case, I will show you how to configure an S3 bucket for both VMware Data Services Manager (DSM) backups and logs, both for the databases and the provider appliance itself. In a second backup use-case, I will show how you can configure a Native Object Storage bucket in the vSphere Kubernetes Service Manager (VKSM) and use it as a backup destination for VKS clusters. In my third use-case, we will look at how I can use an S3 bucket for Greenplum Database external tables. The idea is to be able to export cold data out of the database to external tables stored in an S3 bucket, and import them back to warm them up again, ensuring the cold data is not consuming valuable database storage.</p>
<p style="text-align: justify;"><em>Please note that Native Object Storage is still in <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/" target="_blank" rel="noopener">tech preview</a>, and is only available to some customers for testing. We hope to make it generally available to all our customers very soon.</em></p>
<p style="text-align: justify;">Let&#8217;s begin by looking at the buckets that have been created for the different use-cases. In the DSM organization (dsm-org), I created a dedicated object store for DSM backups and logs. In the tenant-03-org, I also created another object store which the organization admin and users use for both VKS backups and Greenplum database external tables.  Here are the buckets created for the use-cases.</p>
<p>Buckets for VKS backups and Greenplum database external tables:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33259 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?resize=769%2C284&#038;ssl=1" alt="" width="769" height="284" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?resize=1024%2C378&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?resize=300%2C111&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?resize=768%2C284&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?resize=769%2C284&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/1.-tenant-buckets.png?w=1364&amp;ssl=1 1364w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Buckets for DSM backups and logs:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33260 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?resize=769%2C268&#038;ssl=1" alt="" width="769" height="268" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?resize=1024%2C357&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?resize=300%2C105&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?resize=768%2C268&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?resize=769%2C268&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/2.-dsm-buckets.png?w=1149&amp;ssl=1 1149w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>VMware Data Services Manager Backups &amp; Logs</h2>
<p style="text-align: justify;">Configuring the VMware Data Services Manager backup and log location is done via the DSM UI. Login as a DSM Admin. Navigate to Settings &gt; Storage Settings. Then populate the entries for System Backup Repository UTL, System Log Repository URL and Database Backup Storage. The bucket names used below map to the bucket names created in the Native Object Store above. Note that DSM will require the CA used to create the Native Object Storage certificates to be added to its list of Trusted Root Certificates to ensure it can secure communication between itself and the Object Store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33262 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=769%2C206&#038;ssl=1" alt="" width="769" height="206" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=1024%2C274&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=300%2C80&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=768%2C206&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=1536%2C411&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?resize=769%2C206&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/4.-dsm-bup-target-locations.png?w=1633&amp;ssl=1 1633w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">This now enables users of DSM to generate log bundles and do <a href="https://techdocs.broadcom.com/us/en/vmware-cis/dsm/data-services-manager/9-1/working-with-databases-in-vmware-data-services-manager/databases-in-vmware-data-services-manager/restoring-database-to-a-point-in-time.html" target="_blank" rel="noopener">point-in-time (PIT) restores of databases</a>.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33264 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=769%2C270&#038;ssl=1" alt="" width="769" height="270" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=1024%2C360&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=300%2C106&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=768%2C270&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=1536%2C541&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?resize=769%2C271&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/6.-dsm-db-backups.png?w=1631&amp;ssl=1 1631w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>VKS Backups</h2>
<p style="text-align: justify;">When a Kubernetes (VKS) cluster is attached to VKS Management, Data Protection can be optionally enabled. In essence, this is <a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-9-0-and-later/9-0/organization-management/managing-vks-clusters-with-vks-cluster-management/backup-and-restore-of-vks-clusters.html" target="_blank" rel="noopener">adding the necessary Velero component add-ons to the VKS cluster</a>. The VKSM UI can be used to add credentials and endpoints for backups/restores, mapping directly from the Native Object Store access control and buckets. Below is the VKSM UI in VCFA, showing a Target Location which maps back to the &#8220;vks-backups&#8221; bucket seen earlier.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33261" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=769%2C216&#038;ssl=1" alt="" width="769" height="216" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=1024%2C287&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=300%2C84&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=768%2C215&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=1536%2C431&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?resize=769%2C216&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/3.-vks-bup-target-locations.png?w=1630&amp;ssl=1 1630w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p>Once correctly configured, Data Protection can be configures to take on-time backups or scheduled backups of your VKS and its objects. Below is a view of the Data Protection status of one of my VKS clusters by way of  an example:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33266 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=769%2C447&#038;ssl=1" alt="" width="769" height="447" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=1024%2C595&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=300%2C174&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=768%2C446&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=1536%2C892&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?resize=769%2C447&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/5.-vks-bups.png?w=1629&amp;ssl=1 1629w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Greenplum Database External Tables</h2>
<p style="text-align: justify;">Greenplum databases supports <a href="https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/7/greenplum-database/admin_guide-external-g-foreign.html" target="_blank" rel="noopener">accessing external data with foreign tables</a>. This includes data in S3 buckets. To achieve this, the Tanzu team have provided <a href="https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/7/greenplum-database/admin_guide-external-g-s3-protocol.html" target="_blank" rel="noopener">a complete set of instructions</a> on how to use an external S3 bucket to write table data to, and read table data from. I won&#8217;t go through the complete setup &#8211; the instructions are very easy to follow in the official docs. I will show you a few simple <em>psql</em> commands to create some simple tables, one local one and ones which are used to read and write to S3. I will then write table data to the foreign table on S3, making a copy of the local table. I will drop the local table. I will recreate it and finally import the data from S3 back into the local table to show it working.</p>
<h3>s3/s3.conf</h3>
<p style="text-align: justify;">First, there needs to be an <span style="font-family: 'courier new', courier, monospace;">s3/s3.conf</span> file with permissions created for the Greenplum database user who is running the <em>psql</em> command. This configuration file holds the bucket credentials and other configuration information about how the bucket is accessed. This is a very simplified version shown here, with just accessid and secret. I am also asking it to ignore the lack of certificate information. This file must exist on all Greenplum database notes, both coordinators and segments.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[gpadmin@cjhgp01-2 ~]$<strong> cat s3/s3.conf</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[default]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">accessid = "9O9GPGSIKJRNL6WRIDC1"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">secret = "YBOYD9xnOrTC9bZExKPBismRYSpFlFgB1j27OPuJ"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">verifycert = false</span></pre>
<h3>Create two foreign tables, one for S3 reads and one for S3 writes</h3>
<p style="text-align: justify;">These commands are all run after connecting to the Greenplum database. The connection string can be retrieved from the clusters view of Tanzu Data Intelligence UI, where the Greenplum database was provisioned from. Greenplum spins up a &#8220;sample&#8221; database which we can use to test with.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33276 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=769%2C394&#038;ssl=1" alt="" width="769" height="394" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=1024%2C525&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=300%2C154&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=768%2C393&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=1536%2C787&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?resize=769%2C394&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/tdi-gp-conn-string.png?w=1589&amp;ssl=1 1589w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<article>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>CREATE READABLE EXTERNAL TABLE S3FRUIT (id serial, name varchar(100), colour char(10), sku char(8))</strong></span>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">LOCATION('s3://storage-tenant1-oss.rainpole.io:443/greenplum-ext-tables/dataset1/normal/</span></strong>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">config=/home/gpadmin/s3/s3.conf')</span></strong>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">FORMAT 'csv';</span></strong>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE FOREIGN TABLE</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>CREATE WRITABLE EXTERNAL TABLE S3WRFRUIT (LIKE S3FRUIT)</strong></span>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">LOCATION('s3://storage-tenant1-oss.rainpole.io:443/greenplum-ext-tables/dataset1/normal/</span></strong>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">config=/home/gpadmin/s3/s3.conf')</span></strong>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">FORMAT 'csv';</span></strong>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOTICE:  table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE FOREIGN TABLE</span></pre>
</article>
<h3>Create local table, populate with some sample data</h3>
<article>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>create table fruit ( id serial, name varchar(100) not null, colour char(10), sku char(8) );</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE TABLE</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>insert into fruit (id, name, colour, sku) values (DEFAULT, 'Apple', 'Red', '4565'), (DEFAULT, 'Durian', 'Green', '4789');</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT 0 2</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>select * from fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOTICE:  One or more columns in the following table(s) do not have statistics: fruit</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">HINT:  For non-partitioned tables, run analyze &lt;table_name&gt;(&lt;column_list&gt;). For partitioned tables, run analyze rootpartition &lt;table_name&gt;(&lt;column_list&gt;). See log for columns missing statistics.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"> id |  name  |   colour   |   sku</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+--------+------------+----------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  1 | Apple  | Red        | 4565</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  2 | Durian | Green      | 4789</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(2 rows)</span></pre>
</article>
<h3>Copy data from local table to foreign table on S3, then drop local table</h3>
<article>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>insert into S3WRFRUIT</strong></span>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">select * from fruit;</span></strong>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT 0 2</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>select * from s3fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"> id |  name  |   colour   |   sku</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+--------+------------+----------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  2 | Durian | Green      | 4789</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  1 | Apple  | Red        | 4565</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(2 rows)</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>drop table fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">DROP TABLE</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>select * from s3fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"> id |  name  |   colour   |   sku</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+--------+------------+----------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  2 | Durian | Green      | 4789</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  1 | Apple  | Red        | 4565</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(2 rows)</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>select * from fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ERROR:  relation "fruit" does not exist</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">LINE 1: select * from fruit;</span></pre>
</article>
<h3>Recreate local table, read data in from S3 foreign table</h3>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>create table fruit ( id serial, name varchar(100) not null, colour char(10), sku char(8) );</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE TABLE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
sample=# <strong>insert into fruit</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample-# <strong>select * from s3fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT 0 2</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">sample=# <strong>select * from fruit;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOTICE:  One or more columns in the following table(s) do not have statistics: fruit</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">HINT:  For non-partitioned tables, run analyze &lt;table_name&gt;(&lt;column_list&gt;). For partitioned tables, run analyze rootpartition &lt;table_name&gt;(&lt;column_list&gt;). See log for columns missing statistics.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"> id |  name  |   colour   |   sku</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+--------+------------+----------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  2 | Durian | Green      | 4789</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">  1 | Apple  | Red        | 4565</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(2 rows)</span></pre>
<p style="text-align: justify;">So it would appear that we can successfully read and write data to foreign tables on S3 buckets from Greenplum. And to close, just to show you how this information is written to the S3 bucket in question, here is a screenshot of the contents:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33273 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?resize=769%2C218&#038;ssl=1" alt="" width="769" height="218" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?resize=1024%2C290&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?resize=300%2C85&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?resize=768%2C218&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?resize=769%2C218&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/7.-greenplum-table-contents.png?w=1267&amp;ssl=1 1267w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Summary</h2>
<p style="text-align: justify;">Those are just a few of the potential use-cases that Native Object Storage can be used for. There are many others of course, some of which our customers have shared with us. Being able to have a landing ground for external tools and utilities is one such example. Being able to share data across different zones though bucket replication is another. And of course S3 object storage can play a significant role for AI workloads, in particular as a library for model files. Customers could download the model from  (for example) Hugging Face just <strong>once</strong>, scan it for viruses, and save the model onto an internal air-gapped S3 object store. Your AI containers then pull the model from there, safe in the knowledge that the model is validated and secure. We look forward to seeing many more use-cases once Native Object Storage is generally available.</p>
<p>The post <a href="https://cormachogan.com/2026/10/06/native-object-storage-use-cases/">Native Object Storage Use-Cases</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/10/06/native-object-storage-use-cases/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33257</post-id>	</item>
		<item>
		<title>Using the VCF CLI with CCI context to manage VCFA provisioned databases</title>
		<link>https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/</link>
					<comments>https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 07:00:15 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[CCI]]></category>
		<category><![CDATA[Cloud Consumption Interface]]></category>
		<category><![CDATA[DSM]]></category>
		<category><![CDATA[VCF CLI]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33244</guid>

					<description><![CDATA[<p>In a post from last year, I demonstrated how one could use the VCF CLI to troubleshoot the underlying vSphere Kubernetes Service (VKS) on which a VMware Data Services Manager (DSM) database is provisioned. In this follow up post, we will look at how we can use the VCF CLI to fine tune the database itself. This blog post stemmed from a request by one of our customers who wished to modify the backup retention policy and reduce the number of days that a backup is retained. Now you might be wondering why using the VCF CLI is necessary to&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/">Using the VCF CLI with CCI context to manage VCFA provisioned databases</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class=" wp-image-30393 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?resize=151%2C152&#038;ssl=1" alt="" width="151" height="152" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?w=787&amp;ssl=1 787w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?resize=298%2C300&amp;ssl=1 298w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?resize=768%2C773&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-vintage.jpg?resize=769%2C774&amp;ssl=1 769w" sizes="auto, (max-width: 151px) 100vw, 151px" /></a>In a post from last year, I demonstrated how one could <a href="https://cormachogan.com/2025/12/12/using-the-vcf-9-x-cli-to-troubleshoot-a-dsm-database-running-on-vks/" target="_blank" rel="noopener">use the VCF CLI to troubleshoot the underlying vSphere Kubernetes Service (VKS)</a> on which a VMware Data Services Manager (DSM) database is provisioned. In this follow up post, we will look at how we can use the VCF CLI to fine tune the database itself. This blog post stemmed from a request by one of our customers who wished to modify the backup retention policy and reduce the number of days that a backup is retained.</p>
<p style="text-align: justify;">Now you might be wondering why using the VCF CLI is necessary to do this step. The reason is this. As a DSM Admin, this customer has access to the DSM Gateway API from the DSM appliance. However, changes made to a database provisioned via VCF Automation through the DSM Gateway do not get synchronised to  the Supervisor. Thus it is possible that the change gets overridden by subsequent changes on the Supervisor. To make the change persistent, API changes should be made via the Supervisor. This synchronise changes back to DSM. However, to get access to the Supervisor to run kubectl API calls, you first need access to vCenter/vSphere. Not every DSM Admin has access to vCenter. Thus, we explored alternate methods, and found that changes to the database can also be made using using VCF CLI and a CCI context with a API token from VCF Automation. CCI, which stands for Cloud Consumption Interface, is a part of VCF Automation that enables dev-ops users to interact with the various services available in VCFA, such as VKS, VM Service and DSM.</p>
<p style="text-align: justify;">First step is to get your token. Log into your organization in VCF Automation. In the top right hand corner, under User Settings, click My Account. From here you can generate your own API token.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33246 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?resize=769%2C212&#038;ssl=1" alt="" width="769" height="212" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?resize=1024%2C282&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?resize=300%2C83&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?resize=768%2C211&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?resize=769%2C212&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/API-Token.png?w=1224&amp;ssl=1 1224w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Once the token is safely stored, we can commence with the VCF CLI. Note that the download instructions can be found in <a href="https://cormachogan.com/2025/12/12/using-the-vcf-9-x-cli-to-troubleshoot-a-dsm-database-running-on-vks/" target="_blank" rel="noopener">my previous post</a> on this topic, and the steps have not changed since then. However, in this case, we won&#8217;t be accessing the Supervisor API using vSphere credentials, but the VCF Automation (VCFA) API using the token. Run the following VCF CLI command, choosing a name for the context and setting the type to CCI. I am not using a secure connection, but if you wanted to connect securely, there is an option to provide the Certificate Authority (CA) on the command line. The endpoint is my VCFA and not the Supervisor. You will be prompted to provide the name of the organization where the token was created by the user. In this case it is tenant-03-org.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>vcf context create my-cci-context --endpoint https://flt-auto01.rainpole.io --type cci \</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">&gt; <strong>--api-token xURVuNVWak0ItQa4JZnRLjhhDZH5Vx9V --insecure-skip-tls-verify</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Some initialization of the CLI is required.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Let's set things up for you.<span class="Apple-converted-space">  </span>This will just take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Initialization done!</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] ==</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">? Provide Tenant Name:<span class="Apple-converted-space">  </span><strong>tenant-03-org</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Successfully logged into flt-auto01.rainpole.io</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">You have access to the following contexts:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">   </span>my-cci-context</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">   </span>my-cci-context:tenant-03-ns-g8krt:default-project</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">If the namespace context you wish to use is not in this list, you may need to</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">refresh the context again, or contact your cluster administrator.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">To change context, use `vcf context use &lt;context_name&gt;`</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] successfully saved context: my-cci-context</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] successfully saved context: my-cci-context:tenant-03-ns-g8krt:default-project</span>
<span style="font-family: courier new, courier, monospace;"><span style="font-size: 13.3333px;">$</span></span></pre>
<p style="text-align: justify;">Now that we have successfully connected to the VCFA organization using the CCI, we need to set context:</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>vcf context use<span class="Apple-converted-space">  </span>my-cci-context:tenant-03-ns-g8krt:default-project</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[ok] Token is still active. Skipped the token refresh for context "my-cci-context:tenant-03-ns-g8krt:default-project"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Successfully activated context 'my-cci-context:tenant-03-ns-g8krt:default-project' (Type: cloud-consumption-interface)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Using image repository hosts for context 192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Fetching recommended plugins for active context 'my-cci-context:tenant-03-ns-g8krt:default-project'...</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] No image repository override information was found</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Installing the following plugins recommended by context 'my-cci-context:tenant-03-ns-g8krt:default-project':</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>NAME<span class="Apple-converted-space">                </span>INSTALLING</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>addon <span class="Apple-converted-space">              </span>v3.7.0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>cluster <span class="Apple-converted-space">            </span>v3.7.0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>kubernetes-release<span class="Apple-converted-space">  </span>v3.7.0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>namespaces<span class="Apple-converted-space">          </span>v9.1.1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>package <span class="Apple-converted-space">            </span>v3.7.0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>registry-secret <span class="Apple-converted-space">    </span>v3.7.0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>vm<span class="Apple-converted-space">                  </span>v9.1.1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[i] Refreshing plugin inventory cache for "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest", this will take a few seconds.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[x] unable to automatically sync the plugins recommended by the active context. Please run 'vcf plugin sync' to sync plugins manually, error: [unable to list plugins from discovery source 'default': unable to fetch the inventory of discovery 'default' for plugins: plugins discovery image resolution failed. Please check that the repository image URL "192.168.41.71/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory:latest" is correct: error getting the image digest: GET https://192.168.41.71/v2/vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory/manifests/latest: NOT_FOUND: resource not found: repo vcf/vcf-cli-plugins/ga/plugin-inventory/v9-rel/plugin-inventory, tag latest not found, unable to find plugin 'addon' matching version 'v3.7.0', unable to find plugin 'cluster' matching version 'v3.7.0', unable to find plugin 'kubernetes-release' matching version 'v3.7.0', unable to find plugin 'namespaces' matching version 'v9.1.1', unable to find plugin 'package' matching version 'v3.7.0', unable to find plugin 'registry-secret' matching version 'v3.7.0', unable to find plugin 'vm' matching version 'v9.1.1']</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$
</span></pre>
<p style="text-align: justify;">We can begin to query the databases, and even make our change. I can interact with the database and other objects using kubectl. In this example, I am going to modify the provisioned database and reduce the backup retention policy (spec.backupConfig.backupRetentionDays) from the default of 30 days down to 15 days. I list the PostgreSQL clusters in my organization, I check the current backup retention settings, I edit the retention value, wait for the cluster to reconcile before finally verifying that the change has taken effect. In the commands below, k is aliased to kubectl.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k get postgresclusters</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>STATUS <span class="Apple-converted-space">  </span>STORAGE <span class="Apple-converted-space">  </span>VERSION<span class="Apple-converted-space">                </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">pg-for-test <span class="Apple-converted-space">  </span>Ready<span class="Apple-converted-space">    </span>20Gi<span class="Apple-converted-space">      </span>18.4+vmware.v9.1.1.0 <span class="Apple-converted-space">  </span>26h</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k get postgresclusters pg-for-test -o jsonpath='{.spec.backupConfig.backupRetentionDays}{"\n"}'</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">30</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k edit postgresclusters pg-for-test</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">postgrescluster.databases.dataservices.vmware.com/pg-for-test edited</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k get postgresclusters</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>STATUS <span class="Apple-converted-space">      </span>STORAGE <span class="Apple-converted-space">  </span>VERSION<span class="Apple-converted-space">                </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">pg-for-test <span class="Apple-converted-space">  </span>InProgress <span class="Apple-converted-space">  </span>20Gi<span class="Apple-converted-space">      </span>18.4+vmware.v9.1.1.0 <span class="Apple-converted-space">  </span>26h</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k get postgresclusters pg-for-test</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">          </span>STATUS <span class="Apple-converted-space">  </span>STORAGE <span class="Apple-converted-space">  </span>VERSION<span class="Apple-converted-space">                </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">pg-for-test <span class="Apple-converted-space">  </span>Ready<span class="Apple-converted-space">    </span>20Gi<span class="Apple-converted-space">      </span>18.4+vmware.v9.1.1.0 <span class="Apple-converted-space">  </span>26h</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>k get postgresclusters pg-for-test -o jsonpath='{.spec.backupConfig.backupRetentionDays}{"\n"}'</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">15</span></pre>
<p style="text-align: justify;">And if I check back on VCF Automation, selecting my database followed by Backup tab, I can see the reduced Retention value reflected in the UI.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33248 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?resize=769%2C385&#038;ssl=1" alt="" width="769" height="385" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?w=982&amp;ssl=1 982w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?resize=768%2C385&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/10/backup-info.png?resize=769%2C385&amp;ssl=1 769w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">So now we have a way of changing database configuration using the API, but without needing vCenter access or needing to log into the Supervisor.</p>
<p>The post <a href="https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/">Using the VCF CLI with CCI context to manage VCFA provisioned databases</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/10/01/using-the-vcf-cli-with-cci-context-to-manage-vcfa-provisioned-databases/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33244</post-id>	</item>
		<item>
		<title>Introducing PostgreSQL Read Replicas in DSM 9.1.1</title>
		<link>https://cormachogan.com/2026/09/25/introducing-postgresql-read-replicas-in-dsm-9-1-1/</link>
					<comments>https://cormachogan.com/2026/09/25/introducing-postgresql-read-replicas-in-dsm-9-1-1/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Fri, 25 Sep 2026 13:00:40 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[Data Services Manager. DSM]]></category>
		<category><![CDATA[Postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33224</guid>

					<description><![CDATA[<p>In my introduction post to VMware Data Services (DSM) 9.1.1, I mentioned a new feature called PostgreSQL read replicas. In a nutshell, PostgreSQL databases provisioned by DSM can now be scaled for read workloads by adding additional Read Replicas. Previously, a PostgreSQL database cluster was limited to just 3 nodes, a primary, a single replica and a monitor. In DSM 9.1.1, we can now scale PostgreSQL databases through the addition of read replicas. As I mentioned in the introduction to DSM 9.1.1, DSM now uses the term read replica instead of secondary to refer to remote PostgreSQL database instances. They&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/25/introducing-postgresql-read-replicas-in-dsm-9-1-1/">Introducing PostgreSQL Read Replicas in DSM 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class=" wp-image-30383 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=151%2C122&#038;ssl=1" alt="" width="151" height="122" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=1024%2C831&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=300%2C244&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=768%2C623&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=769%2C624&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?w=1386&amp;ssl=1 1386w" sizes="auto, (max-width: 151px) 100vw, 151px" /></a>In <a href="https://cormachogan.com/2026/09/04/announcing-vmware-data-services-manager-9-1-1/" target="_blank" rel="noopener">my introduction post</a> to VMware Data Services (DSM) 9.1.1, I mentioned a new feature called PostgreSQL read replicas. In a nutshell, PostgreSQL databases provisioned by DSM can now be scaled for read workloads by adding additional Read Replicas. Previously, a PostgreSQL database cluster was limited to just 3 nodes, a primary, a single replica and a monitor. In DSM 9.1.1, we can now scale PostgreSQL databases through the addition of read replicas. As I mentioned in the introduction to DSM 9.1.1, DSM now uses the term read replica instead of secondary to refer to remote PostgreSQL database instances. They continue to be used to replicate data from a primary database. Read replicas now serve both disaster recovery and read-scaling use cases. Once remote replication is enabled on a PostgreSQL primary database, the same workflow used for DR is now used to enable the creation of PostgreSQL read replicas. In this post, I will demonstrate how to do exactly that.</p>
<p style="text-align: justify;">First, let create a PostgreSQL cluster via VCF Automation version 9.1.1. I am going to build a PostgreSQL version 18 which is newly supported in this DSM 9.1.1 release.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33226 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?resize=769%2C562&#038;ssl=1" alt="" width="769" height="562" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?resize=1024%2C749&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?resize=300%2C219&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?resize=768%2C562&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?resize=769%2C563&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-10.54.43.png?w=1121&amp;ssl=1 1121w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">During the setup, enable replication and add the configuration for the replication slot and replication user. There is a significant amount of text related to cross-region replication, when the primary and the replica are in different regions. Some firewall rules may need to be in place to enable communication between the primary and the read replica. If you are deploying the primary and the read replicas in different regions, pay particular attention to this note.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33235 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=769%2C391&#038;ssl=1" alt="" width="769" height="391" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=1024%2C521&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=300%2C153&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=768%2C391&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=1536%2C781&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?resize=769%2C391&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-16.19.42.png?w=1805&amp;ssl=1 1805w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Once deployed, make a copy of the replication string. This will be needed to create the read replica.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33229 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=769%2C369&#038;ssl=1" alt="" width="769" height="369" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=1024%2C491&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=300%2C144&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=768%2C368&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=1536%2C737&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?resize=769%2C369&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.20.47.png?w=1814&amp;ssl=1 1814w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p>We can now begin with the creation of a Read Replica. When it comes to the replication source section, populate the connection string saved from the primary, and add the replication slot. Note that the text related to SNAT IP address between the primary and replica is again mentioned.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33230" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=769%2C269&#038;ssl=1" alt="" width="769" height="269" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=1024%2C358&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=300%2C105&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=768%2C269&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=1536%2C537&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?resize=769%2C269&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.22.05.png?w=1819&amp;ssl=1 1819w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Add the user connection string, the slot and any custom Certificate Authority that you might be using. The Extra Clients is only relevant if you are using the new DSM Network Security features, and creates rules in the NSX firewall to allow the IP addresses of these clients to have access to the database. See <a href="https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/" target="_blank" rel="noopener">my post on DSM 9.1.1 Network Security</a> for further information. Wait for the Read Replica to become ready:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33232 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=769%2C155&#038;ssl=1" alt="" width="769" height="155" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=1024%2C207&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=768%2C155&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=1536%2C311&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?resize=769%2C156&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.24.png?w=1814&amp;ssl=1 1814w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p>And verify that the primary&#8217;s replication status is &#8220;Replicating&#8221;:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33233" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=769%2C156&#038;ssl=1" alt="" width="769" height="156" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=1024%2C208&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=768%2C156&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=1536%2C312&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?resize=769%2C156&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-23-at-11.32.50.png?w=1814&amp;ssl=1 1814w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Now let&#8217;s test read only access to the replica. To do that, I made a simply psql script which created a table of &#8216;mock&#8217; employee data and populated with some random values. Here is that script.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 1. Clean up existing table if you're re-running the script</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">DROP TABLE IF EXISTS mock_employees;</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 2. Create the table structure</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE TABLE mock_employees (</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    id SERIAL PRIMARY KEY,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    employee_code VARCHAR(10),</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    age INT,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    salary NUMERIC(10, 2),</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    department VARCHAR(50),</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    is_active BOOLEAN,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    hire_date TIMESTAMP</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">);</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 3. Generate and insert 10,000 rows of random data</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT INTO mock_employees (</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    employee_code, </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    age, </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    salary, </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    department, </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    is_active, </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random UUID, converts to text, and grabs the first 8 characters</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">substr(gen_random_uuid()::text, 1, 8),</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random age between 18 and 65</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">floor(random() * 48 + 18)::INT,</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random salary between $30,000.00 and $130,000.00</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(random() * 100000 + 30000)::NUMERIC(10, 2),</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Picks a random department from an array of options</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(ARRAY['Engineering', 'Sales', 'Marketing', 'HR', 'Finance', 'Legal'])[floor(random() * 6 + 1)],</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random boolean (True/False)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">random() &gt; 0.5,</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random timestamp somewhere within the last 5 years (1825 days)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOW() - (random() * interval '1825 days')</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">FROM </span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">generate_series(1, 10000);</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 4. Verify the row count and look at a sample of the data</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT count(*) FROM mock_employees;</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT * FROM mock_employees LIMIT 5;</span></pre>
<p>I then ran the script as follows, suing the connection string to the primary:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>psql postgresql://pgadmin:it0QI80D5Nm8x3LPUNYdiYQ6l88e0E@192.168.20.11:5432/tenant03-primary \
-f random.psql</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">DROP TABLE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CREATE TABLE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT 0 10000</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">count</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">10000</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(1 row)</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">id | employee_code | age | salary | department | is_active | hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+---------------+-----+-----------+------------+-----------+----------------------------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">1 | 42d9150f | 45 | 114332.05 | Sales | t | 2024-12-26 20:01:48.992993</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2 | da648072 | 37 | 94975.66 | Legal | f | 2023-06-21 20:20:11.392203</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">3 | fa4fe54e | 31 | 108578.06 | Legal | f | 2026-06-14 10:41:03.661193</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">4 | 469205d7 | 55 | 92738.15 | Finance | t | 2024-01-16 03:31:14.870633</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">5 | 6ad4f01b | 65 | 121029.85 | HR | f | 2024-02-25 17:48:11.016703</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(5 rows)</span></pre>
<p>Afterwards, I ran another script every 30 seconds to keep updating the table. Here is that script:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 1. Generate and insert 100 rows of random data</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT INTO mock_employees (</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    employee_code,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    age,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    salary,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    department,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    is_active,</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">    hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random UUID, converts to text, and grabs the first 8 characters</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">substr(gen_random_uuid()::text, 1, 8),</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random age between 18 and 65</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">floor(random() * 48 + 18)::INT,</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random salary between $30,000.00 and $130,000.00</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(random() * 100000 + 30000)::NUMERIC(10, 2),</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Picks a random department from an array of options</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(ARRAY['Engineering', 'Sales', 'Marketing', 'HR', 'Finance', 'Legal'])[floor(random() * 6 + 1)],</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random boolean (True/False)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">random() &gt; 0.5,</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- Generates a random timestamp somewhere within the last 5 years (1825 days)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NOW() - (random() * interval '1825 days')</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">FROM</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">generate_series(1, 100);</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-- 4. Verify the row count and look at a sample of the data</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT count(*) FROM mock_employees;</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SELECT * FROM mock_employees LIMIT 5;</span></pre>
<p>And here is how I ran it every 30 seconds:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ </span><strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">while true
do<span class="Apple-converted-space">  
</span>psql postgresql://pgadmin:it0QI80D5Nm8x3LPUNYdiYQ6l88e0E@192.168.20.11:5432/tenant03-primary \
-f random-100-new.psql 
sleep 30
done</span></strong>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">INSERT 0 100</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">count</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">10100</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(1 row)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">id | employee_code | age |<span class="Apple-converted-space">  </span>salary <span class="Apple-converted-space">  </span>| department | is_active | <span class="Apple-converted-space">        </span>hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+---------------+-----+-----------+------------+-----------+----------------------------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>1 | 42d9150f<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>45 | 114332.05 | Sales<span class="Apple-converted-space">      </span>| t <span class="Apple-converted-space">        </span>| 2024-12-26 20:01:48.992993</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>2 | da648072<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>37 |<span class="Apple-converted-space">  </span>94975.66 | Legal<span class="Apple-converted-space">      </span>| f <span class="Apple-converted-space">        </span>| 2023-06-21 20:20:11.392203</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>3 | fa4fe54e<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>31 | 108578.06 | Legal<span class="Apple-converted-space">      </span>| f <span class="Apple-converted-space">        </span>| 2026-06-14 10:41:03.661193</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>4 | 469205d7<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>55 |<span class="Apple-converted-space">  </span>92738.15 | Finance<span class="Apple-converted-space">    </span>| t <span class="Apple-converted-space">        </span>| 2024-01-16 03:31:14.870633</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>5 | 6ad4f01b<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>65 | 121029.85 | HR <span class="Apple-converted-space">        </span>| f <span class="Apple-converted-space">        </span>| 2024-02-25 17:48:11.016703</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(5 rows)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
INSERT 0 100</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">count</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">10200</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(1 row)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
id | employee_code | age |<span class="Apple-converted-space">  </span>salary <span class="Apple-converted-space">  </span>| department | is_active | <span class="Apple-converted-space">        </span>hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+---------------+-----+-----------+------------+-----------+----------------------------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>1 | 42d9150f<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>45 | 114332.05 | Sales<span class="Apple-converted-space">      </span>| t <span class="Apple-converted-space">        </span>| 2024-12-26 20:01:48.992993</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>2 | da648072<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>37 |<span class="Apple-converted-space">  </span>94975.66 | Legal<span class="Apple-converted-space">      </span>| f <span class="Apple-converted-space">        </span>| 2023-06-21 20:20:11.392203</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>3 | fa4fe54e<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>31 | 108578.06 | Legal<span class="Apple-converted-space">      </span>| f <span class="Apple-converted-space">        </span>| 2026-06-14 10:41:03.661193</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>4 | 469205d7<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>55 |<span class="Apple-converted-space">  </span>92738.15 | Finance<span class="Apple-converted-space">    </span>| t <span class="Apple-converted-space">        </span>| 2024-01-16 03:31:14.870633</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>5 | 6ad4f01b<span class="Apple-converted-space">      </span>|<span class="Apple-converted-space">  </span>65 | 121029.85 | HR <span class="Apple-converted-space">        </span>| f <span class="Apple-converted-space">        </span>| 2024-02-25 17:48:11.016703</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(5 rows)
...</span></pre>
<p>Next, retrieve the connection string from the read replica. First, make sure we can read the replicated data.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>psql postgresql://rep-user-1:91W2s6pWoT4jkEG72Gm33dRQHE5wDO@192.168.20.13:5432/tenant03-primary</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">psql (16.15 (Ubuntu 16.15-0ubuntu0.24.04.1), server 18.4 (VMware Postgres 18.4.0))</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">WARNING: psql major version 16, server major version 18.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Some psql features might not work.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Type "help" for help.</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant03-primary=# <strong>SELECT count(*) FROM mock_employees;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">count</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">-------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">10900</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(1 row)</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant03-primary=# <strong>SELECT * FROM mock_employees LIMIT 5;</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">id  | employee_code | age | salary    | department | is_active | hire_date</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">----+---------------+-----+-----------+------------+-----------+----------------------------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">1   | 42d9150f      | 45  | 114332.05 | Sales      | t         | 2024-12-26 20:01:48.992993</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2   | da648072      | 37  | 94975.66  | Legal      | f         | 2023-06-21 20:20:11.392203</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">3   | fa4fe54e      | 31  | 108578.06 | Legal      | f         | 2026-06-14 10:41:03.661193</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">4   | 469205d7      | 55  | 92738.15  | Finance    | t         | 2024-01-16 03:31:14.870633</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">5   | 6ad4f01b      | 65  | 121029.85 | HR         | f         | 2024-02-25 17:48:11.016703</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(5 rows)</span></pre>
<p style="text-align: justify;">That appears to be successful. The table exists, the number of entries seems to match the primary and the data looks reasonably good as well. What if we now try to write something on the read replica, such as trying to create a new table for example.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tenant03-primary=# <strong>CREATE TABLE new_mock_employees (id SERIAL PRIMARY KEY);</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ERROR: cannot execute CREATE TABLE in a read-only transaction</span></pre>
<p style="text-align: justify;">As expected, this operation failed since this is a read replica and writes are not permitted. To summarise, those of you who are familiar with secondary databases from previous DSM versions should see similarities with this workflow. It is more or less identical to the creation of a secondary database for Disaster Recovery (DR) use-cases that we saw in prior releases. Once the read replica is created, it can be used by read-only workloads. This is a very useful feature for customers who wish to scale their databases for read intensive workloads.</p>
<p style="text-align: justify;">As per the guidance in the <a href="https://techdocs.broadcom.com/us/en/vmware-cis/dsm/data-services-manager/9-1/working-with-databases-in-vmware-data-services-manager/databases-in-vmware-data-services-manager/postgresql-on-vmware-data-services-manager/postgresql-disaster-recovery.html" target="_blank" rel="noopener">official documentation</a>, starting with version 9.1.1, Data Services Manager provisions each PostgreSQL cluster with support for up to 12 replication slots by default, controlled by the max_replication_slots parameter. Of these, two slots are always reserved for high availability (HA). The system holds the HA reservation regardless of whether the cluster is running as standalone or in HA mode, so that converting a standalone cluster to a primary cluster with read replicas can always succeed without changing the max_replication_slots parameter. This leaves 10 replication slots available for user workloads out of the box, implying you can have up to 10 read replicas.</p>
<p>The post <a href="https://cormachogan.com/2026/09/25/introducing-postgresql-read-replicas-in-dsm-9-1-1/">Introducing PostgreSQL Read Replicas in DSM 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/25/introducing-postgresql-read-replicas-in-dsm-9-1-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33224</post-id>	</item>
		<item>
		<title>How to enable SSH on DSM Appliance when deployed via VCFA 9.1.1</title>
		<link>https://cormachogan.com/2026/09/21/how-to-enable-ssh-on-dsm-appliance-when-deployed-via-vcfa-9-1-1/</link>
					<comments>https://cormachogan.com/2026/09/21/how-to-enable-ssh-on-dsm-appliance-when-deployed-via-vcfa-9-1-1/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Mon, 21 Sep 2026 13:00:05 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[Data Services Manager. DSM]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33214</guid>

					<description><![CDATA[<p>In my initial post introducing VMware Data Services Manager (DSM) 9.1.1 features, I mentioned that DSM can now be deployed directly from VCF Automation. As part of a concerted effort to make Data Services (and the VCF platform) highly secure, SSH access is not automatically enabled on the DSM 9.1.1 appliance. In this post, I will show you how to enable it should you need SSH access to the DSM appliance. The first step is to gain SSH Access to the vCenter server. The steps are outlined in this Knowledge Base article on troubleshooting. Once you&#8217;ve managed to get a&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/21/how-to-enable-ssh-on-dsm-appliance-when-deployed-via-vcfa-9-1-1/">How to enable SSH on DSM Appliance when deployed via VCFA 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignleft wp-image-30383" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=151%2C122&#038;ssl=1" alt="" width="151" height="122" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=1024%2C831&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=300%2C244&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=768%2C623&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=769%2C624&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?w=1386&amp;ssl=1 1386w" sizes="auto, (max-width: 151px) 100vw, 151px" /></a>In my initial post <a href="https://cormachogan.com/2026/09/04/announcing-vmware-data-services-manager-9-1-1/" target="_blank" rel="noopener">introducing VMware Data Services Manager (DSM) 9.1.1 features</a>, I mentioned that DSM can now be deployed directly from VCF Automation. As part of a concerted effort to make Data Services (and the VCF platform) highly secure, SSH access is not automatically enabled on the DSM 9.1.1 appliance. In this post, I will show you how to enable it should you need SSH access to the DSM appliance.</p>
<p style="text-align: justify;">The first step is to gain SSH Access to the vCenter server. The steps are outlined in this <a href="https://knowledge.broadcom.com/external/article/323407/troubleshooting-vsphere-with-tanzu-tkgs.html" target="_blank" rel="noopener">Knowledge Base article on troubleshooting</a>. Once you&#8217;ve managed to get a shell open on your vCenter server, the following commands can be used to retrieve the root password to gain access to the Supervisor.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Command&gt; <strong>shell</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Shell access is granted to root</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@sfo-w01-vc01 [ ~ ]# <strong>cd /usr/lib/vmware-wcp/</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@sfo-w01-vc01 [ /usr/lib/vmware-wcp ]# <strong>./decryptK8Pwd.py</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Read key from file</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Connected to PSQL</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Cluster: domain-c9:09ddf26c-f7e2-4333-b023-aa4a36024b79</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">IP: <em>192.168.1.200</em></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PWD: <em>AbCdEfGhIj</em></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">------------------------------------------------------------</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@sfo-w01-vc01 [ /usr/lib/vmware-wcp ]# <strong>sshpass -p '<em>AbCdEfGhIj</em>' ssh -o \
stricthostkeychecking=no root@192.168.1.200</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Last login: Fri Sep 18 10:45:31 2026 from 192.168.1.130</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">===============================================================================</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">EXERCISE EXTREME CAUTION when accessing a vSphere Supervisor control plane VM.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">When running commands on a Supervisor control plane VM, you are acting with</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">elevated permissions that BYPASS PROTECTIONS. You may cause DATA LOSS, disrupt</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">running workloads, or PERMANENTLY DAMAGE the Supervisor, Supervisor Services</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">including the vSphere Kubernetes Service (VKS), or VKS Clusters.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Graceful recovery from changes made with these elevated permissions may not</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">be possible; it may be necessary to REDEPLOY THE ENTIRE SUPERVISOR, recreate</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">all VKS clusters, and redeploy all workloads.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">===============================================================================</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">08:09:45 up 12 days, 22:03,<span class="Apple-converted-space">  </span>0 users,<span class="Apple-converted-space">  </span>load average: 7.72, 6.12, 5.87</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">tdnf update info not available yet!</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]#</span></pre>
<p style="text-align: justify;">Once successfully logged onto the Supervisor, query the Data Service Manager deployment. In VCFA 9.1.1, the DSM is deploying using the VM Service feature. The follow commands can be used to check the name of the appliance and the opened ports on it. Note that on the Control Plane VM (Supervisor), the <em>kubectl</em> command is aliased to a simple &#8216;k&#8217;.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get vm -A | grep dsm</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">svc-dsm-provider-operator-r77bq <span class="Apple-converted-space">  </span>dsm-appliance <span class="Apple-converted-space">                    </span>PoweredOn <span class="Apple-converted-space">    </span>10d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get vmservice -n svc-dsm-provider-operator-r77bq</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME<span class="Apple-converted-space">                          </span>TYPE <span class="Apple-converted-space">          </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-internal<span class="Apple-converted-space">        </span>ClusterIP<span class="Apple-converted-space">      </span>10d</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-lb<span class="Apple-converted-space">              </span>LoadBalancer <span class="Apple-converted-space">  </span>10d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get vmservice -n svc-dsm-provider-operator-r77bq \
dsm-appliance-lb -o yaml</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">apiVersion: vmoperator.vmware.com/v1alpha5</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">kind: VirtualMachineService</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">metadata:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>creationTimestamp: "2026-09-10T13:25:35Z"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>finalizers:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- vmoperator.vmware.com/virtualmachineservice</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>generation: 1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>name: dsm-appliance-lb</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>namespace: svc-dsm-provider-operator-r77bq</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>ownerReferences:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- apiVersion: provider.dataservices.vmware.com/v1alpha1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>blockOwnerDeletion: true</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>controller: true</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>kind: DSMAppliance</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>name: dsm-appliance</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>uid: 14347c54-628d-4a35-ad8d-802d02ea23bc</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>resourceVersion: "2065849"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>uid: a25607df-b720-4e58-bb86-cee6525ea006</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">spec:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>ports:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- name: <strong>https</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>port: <strong>443</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>protocol: <strong>TCP</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>targetPort: <strong>443</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>selector:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>dsm.vmware.com/appliance-name: dsm-appliance</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>type: LoadBalancer</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">status:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>loadBalancer:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>ingress:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>- ip: <strong>192.168.41.72</strong></span></pre>
<p style="text-align: justify;">By default, the DSM appliance is only servicing the https port, 443. This allows administrator to connect to the DSM UI via a browser using the loadBalancer IP address, but no other ports are accessible via that address. To allow SSH access (port 22), create a new YAML manifest similar to the above for an additional VM Service on the DSM Appliance. A sample manifest will look something similar to the following:</p>
<pre class="p2"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">apiVersion: vmoperator.vmware.com/v1alpha5</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">kind: VirtualMachineService</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">metadata:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>name: dsm-appliance-lb-additional</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>namespace: svc-dsm-provider-operator-r77bq</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">spec:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>ports:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- name: ssh</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>port: 22</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>protocol: TCP</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>targetPort: 22</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>selector:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>dsm.vmware.com/appliance-name: dsm-appliance</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>type: LoadBalancer</span></pre>
<p style="text-align: justify;">Apply the manifest. This creates a new VM Service. Note that the SSH port 22 is opened on a different IP address compared to the IP address associated with the https port above. However both redirect to the same DSM appliance:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]#<strong> k apply -f dsm-ssh.yaml</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">virtualmachineservice.vmoperator.vmware.com/dsm-appliance-lb-additional created</span>


<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get vmservice -n svc-dsm-provider-operator-r77bq</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME                          TYPE            AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-internal        ClusterIP       10d</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-lb              LoadBalancer    10d</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-lb-additional   LoadBalancer    14s</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">

root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get vmservice -n svc-dsm-provider-operator-r77bq dsm-appliance-lb-additional -o yaml</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">apiVersion: vmoperator.vmware.com/v1alpha5</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">kind: VirtualMachineService</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">metadata:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>annotations:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>kubectl.kubernetes.io/last-applied-configuration: |</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">      </span>{"apiVersion":"vmoperator.vmware.com/v1alpha5","kind":"VirtualMachineService","metadata":{"annotations":{},"name":"dsm-appliance-lb-additional","namespace":"svc-dsm-provider-operator-r77bq"},"spec":{"ports":[{"name":"ssh","port":22,"protocol":"TCP","targetPort":22}],"selector":{"dsm.vmware.com/appliance-name":"dsm-appliance"},"type":"LoadBalancer"}}</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>creationTimestamp: "2026-09-21T08:27:34Z"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>finalizers:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- vmoperator.vmware.com/virtualmachineservice</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>generation: 1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>name: dsm-appliance-lb-additional</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>namespace: svc-dsm-provider-operator-r77bq</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>resourceVersion: "16164207"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>uid: ae4a417c-bedc-4d08-bd6b-b11264b47751</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">spec:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>ports:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>- name: <strong>ssh</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>port: <strong>22</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>protocol: <strong>TCP</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>targetPort: <strong>22</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>selector:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>dsm.vmware.com/appliance-name: dsm-appliance</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>type: LoadBalancer</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">status:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">  </span>loadBalancer:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>ingress:</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>- ip: <strong>192.168.41.73</strong></span></pre>
<p style="text-align: justify;">At this point, SSH is opened to the DSM appliance via a new loadBalancer IP address. This means that we should be able to SSH to it. However, in order to be able to login as the root user, the root password must also be retrieved. This is help in a secret called <em>dsm-appliance-root-cred</em> in the same namespace. Here is just one example of how to retrieve it.</p>
<pre class="p2"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get secrets -n svc-dsm-provider-operator-r77bq</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAME <span class="Apple-converted-space">                                </span>TYPE <span class="Apple-converted-space">                            </span>DATA <span class="Apple-converted-space">  </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-appliance-root-cred<span class="Apple-converted-space">              </span>Opaque <span class="Apple-converted-space">                          </span>1<span class="Apple-converted-space">      </span>10d</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-po-values<span class="Apple-converted-space">                        </span>Opaque <span class="Apple-converted-space">                          </span>1<span class="Apple-converted-space">      </span>10d</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dsm-provider-operator-pull-regcred <span class="Apple-converted-space">  </span>kubernetes.io/dockerconfigjson <span class="Apple-converted-space">  </span>1<span class="Apple-converted-space">      </span>10d</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>k get secrets -n svc-dsm-provider-operator-r77bq \
dsm-appliance-root-cred --template='{{.data.root_password}}' | base64 -d; echo</strong></span>
<em><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">9L0b^9Lu%V@8mXl</span></em>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]#</span></pre>
<p style="text-align: justify;">Now we have SSH opened, we have the IP address to reach the DSM appliance and we have the root password. Let&#8217;s see if we can successfully access it.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@423789b3f055e8e9961d56e456f323d6 [ ~ ]# <strong>ssh root@192.168.41.73</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Welcome to Photon 5.0 (\m) - Kernel \r (\l)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">(root@192.168.41.73) Password: <em>9L0b^9Lu%V@8mXl</em></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@photon-6ca473c9efbb [ ~ ]# <strong>docker ps</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CONTAINER ID <span class="Apple-converted-space">  </span>IMAGE<span class="Apple-converted-space">                                                  </span>COMMAND<span class="Apple-converted-space">                  </span>CREATED <span class="Apple-converted-space">      </span>STATUS <span class="Apple-converted-space">      </span>PORTS<span class="Apple-converted-space">                      </span>NAMES</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">dc797efaaa57 <span class="Apple-converted-space">  </span>dsm-tsql-provisioner:9.1.1.0.25641961<span class="Apple-converted-space">                  </span>"/provisioner --conf…" <span class="Apple-converted-space">  </span>5 days ago<span class="Apple-converted-space">    </span>Up 5 days <span class="Apple-converted-space">                              </span>dsm-tsql-provisioner-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">77121de7aacd <span class="Apple-converted-space">  </span>vc-session-manager:9.1.1.0.25641961<span class="Apple-converted-space">                    </span>"/vc-session-manager…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>vc-session-manager-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">e155538f05d9 <span class="Apple-converted-space">  </span>telegraf:v1.38.4_vmware.1<span class="Apple-converted-space">                              </span>"/bin/sh -c 'telegra…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>dsm-telegraf-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">c50cdede22b4 <span class="Apple-converted-space">  </span>provider-update-service:9.1.1.0.25641960 <span class="Apple-converted-space">              </span>"/bin/sh -c '/usr/ja…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>provider-update-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">8ecc8312b858 <span class="Apple-converted-space">  </span>provider-monitoring-service:9.1.1.0.25641960 <span class="Apple-converted-space">          </span>"/bin/sh -c '/usr/ja…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>monitoring-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2ddc5884de06 <span class="Apple-converted-space">  </span>registry:3 <span class="Apple-converted-space">                                            </span>"/entrypoint.sh /etc…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>docker-registry</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">1297b75df54e <span class="Apple-converted-space">  </span>simplified-gateway:9.1.1.0.25641961<span class="Apple-converted-space">                    </span>"/gateway --v=5 --ds…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days <span class="Apple-converted-space">  </span>127.0.0.1:5443-&gt;6443/tcp <span class="Apple-converted-space">  </span>sgw-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">554efa07f087 <span class="Apple-converted-space">  </span>dsm/cluster-api-controller:1.13.2_vmware.2 <span class="Apple-converted-space">            </span>"/manager --leader-e…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>kubernetes-service-capi-1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aee34cb51ecf <span class="Apple-converted-space">  </span>dsm/kubeadm-bootstrap-controller:1.13.2_vmware.2 <span class="Apple-converted-space">      </span>"/manager --leader-e…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>kubernetes-service-kadm-1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">234b8a29a113 <span class="Apple-converted-space">  </span>dsm/cluster-api-ipam-provider-in-cluster:1.1.0 <span class="Apple-converted-space">        </span>"/manager --leader-e…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>kubernetes-service-caip-1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">3d0d49c989fe <span class="Apple-converted-space">  </span>dsm/kubeadm-control-plane-controller:1.13.2_vmware.2 <span class="Apple-converted-space">  </span>"/manager --leader-e…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>kubernetes-service-kcp-1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">1718cea3e5e0 <span class="Apple-converted-space">  </span>dsm/cluster-api-vsphere-controller:1.16.1_vmware.2 <span class="Apple-converted-space">    </span>"/manager --leader-e…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>kubernetes-service-capv-1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">cf767b7526af <span class="Apple-converted-space">  </span>kubernetes-service:9.1.1.0.25641963<span class="Apple-converted-space">                    </span>"/opt/moneta/kuberne…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days <span class="Apple-converted-space">  </span>0.0.0.0:6443-&gt;6443/tcp <span class="Apple-converted-space">    </span>kubernetes-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">a2b5b3972550 <span class="Apple-converted-space">  </span>provider-service:9.1.1.0.25641960<span class="Apple-converted-space">                      </span>"/usr/bin/bash -c 'v…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>provider-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">3f4d4399ee9d <span class="Apple-converted-space">  </span>bitnami-influxdb:1.12.4-photon-5 <span class="Apple-converted-space">                      </span>"/bin/sh -c 'influxd…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days<span class="Apple-converted-space">                              </span>influxdb-service</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">85df57a66487 <span class="Apple-converted-space">  </span>provider-ui:9.1.1.0.25641967 <span class="Apple-converted-space">                          </span>"/bin/sh -c '/usr/sb…" <span class="Apple-converted-space">  </span>10 days ago <span class="Apple-converted-space">  </span>Up 10 days <span class="Apple-converted-space">  </span>0.0.0.0:443-&gt;8443/tcp<span class="Apple-converted-space">      </span>provider-ui</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
root@photon-6ca473c9efbb [ ~ ]# <strong>kg get postgresclusters -A</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">NAMESPACE <span class="Apple-converted-space">                  </span>NAME <span class="Apple-converted-space">                </span>STATUS <span class="Apple-converted-space">  </span>STORAGE <span class="Apple-converted-space">  </span>VERSION<span class="Apple-converted-space">                </span>AGE</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">7b6916-tenant-03-ns-g8krt <span class="Apple-converted-space">  </span>tenant-03-pg-db-01 <span class="Apple-converted-space">  </span>Ready<span class="Apple-converted-space">    </span>20Gi<span class="Apple-converted-space">      </span>18.4+vmware.v9.1.1.0 <span class="Apple-converted-space">  </span>10d</span></pre>
<p style="text-align: justify;">Everything looks to be working as expected. Remember that once you are finished with your troubleshooting on the DSM appliance, remove the VM Service that was created earlier. This will ensure that SSH access to the DSM appliance is once again removed. Retain the YAML manifest though, as you can re-apply it when you need to open SSH access once again.</p>
<p>The post <a href="https://cormachogan.com/2026/09/21/how-to-enable-ssh-on-dsm-appliance-when-deployed-via-vcfa-9-1-1/">How to enable SSH on DSM Appliance when deployed via VCFA 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/21/how-to-enable-ssh-on-dsm-appliance-when-deployed-via-vcfa-9-1-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33214</post-id>	</item>
		<item>
		<title>Bucket Policies in VCFA 9.1.1 for Native Object Storage</title>
		<link>https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/</link>
					<comments>https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Fri, 18 Sep 2026 13:00:10 +0000</pubDate>
				<category><![CDATA[Native Object Storage]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[VSAN]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33177</guid>

					<description><![CDATA[<p>In an earlier post on object storage, we look at the role privieges that VCF Automation users could be assigned within an organization. Since the scope of object storage privileges is at the project level, we also looked at the role of Project Admins and Project Advanced Users. within a project. We saw how a Project Admin could grant access control to different Project Users, creating access control policies to control which s3 actions and which s3 resource that a user was allowed in a given project. In this post, I wanted to take this a little further. As mentioned,&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/">Bucket Policies in VCFA 9.1.1 for Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignleft wp-image-33151 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?resize=198%2C224&#038;ssl=1" alt="" width="198" height="224" /></a>In <a href="https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/" target="_blank" rel="noopener">an earlier post</a> on object storage, we look at the role privieges that VCF Automation users could be assigned within an organization. Since the scope of object storage privileges is at the project level, we also looked at the role of Project Admins and Project Advanced Users. within a project. We saw how a Project Admin could grant access control to different Project Users, creating access control policies to control which s3 actions and which s3 resource that a user was allowed in a given project. In this post, I wanted to take this a little further. As mentioned, the scope of a user&#8217;s privileges is the project. But suppose I had a user who was in two different projects in the same organisation. And I wanted this user to be able to copy contents between their buckets that are in the different projects. By default, this is not allowed. But it is possible to construct a bucket policy that will allow the user to copy between those different project buckets. Let&#8217;s see how to do that in this post.</p>
<p style="text-align: justify;">Let&#8217;s use an LDAP user. In this case, my LDAP user is called <strong>tenant01</strong>. At the organisation level, this user is an org user with object store privileges. At the project level, this user has been given the role of Project Administrator in two projects in my organisation. The projects are called default-project and shared-project. This user also has a bucket in each project, built on the same object storage, <em>proj-admin-bucket-01-def-proj</em> (default-project) and <em>proj-admin-bucket-02-shared-proj</em> (shared-project). I am going to use the aws cli to demonstrate how it is not possible to copy from one bucket to another bucket, and then configure Native Object Storage bucket policies to show how it can be achieved. I will show you where to retrieve the account id shortly. I will also show you how to create the profiles for the user so that they can be used with the aws cli.</p>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>Organization</strong></td>
<td style="text-align: center;" colspan="2">tenant-01-org</td>
</tr>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>LDAP User</strong></td>
<td style="width: 33.3333%; text-align: center;" colspan="2">tenant01</td>
</tr>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>Project</strong></td>
<td style="width: 33.3333%; text-align: center;">default-project</td>
<td style="width: 33.3333%; text-align: center;">shared-project</td>
</tr>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>Account ID</strong></td>
<td style="width: 33.3333%; text-align: center;">38925014951642977</td>
<td style="width: 33.3333%; text-align: center;">67271507534621802</td>
</tr>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>Bucket</strong></td>
<td style="width: 33.3333%; text-align: center;">proj-admin-bucket-01-def-proj</td>
<td style="width: 33.3333%; text-align: center;">proj-admin-bucket-02-shared-proj</td>
</tr>
<tr>
<td style="width: 33.3333%; border-style: solid; border-color: #000000; text-align: center;"><strong>Profile</strong></td>
<td style="width: 33.3333%; text-align: center;">tenant01-default-project</td>
<td style="width: 33.3333%; text-align: center;">tenant01-shared-project</td>
</tr>
</tbody>
</table>
<h2>Initial setup</h2>
<p style="text-align: justify;">If using the aws cli, some configuration and credential files need to be created first. I am using an Ubuntu Linux jump-box, and have install the aws cli <a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions" target="_blank" rel="noopener">found here</a>. I created a <span style="font-family: 'courier new', courier, monospace;">.aws/config</span> and a <span style="font-family: 'courier new', courier, monospace;">.aws/credentials</span> for my LDAP user <strong>tenant01</strong>. Note the relationship between the profile name used in the <span style="font-family: 'courier new', courier, monospace;">.aws/config</span> and the entries in the credentials file. It is important to make these match. In the config file, the<strong> ca_bundle</strong> is optional. You can use <span style="font-family: 'courier new', courier, monospace;">&#8211;no-verify-ssl</span> on the command line if you prefer. The CA file is the same CA that was used to sign the certificate for the object storage wildcard certificate when it was created in VCFA. The <strong>endpoint_url</strong> points to my object store. In the <span style="font-family: 'courier new', courier, monospace;">.aws/credentials</span>, the key and secret can be obtain from the Native Object Storage UI in VCF Automation.</p>
<h4>.aws/config</h4>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[profile tenant01-default-project]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">region = cork-region</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ca_bundle = /home/cormac/s3/ca-cert.pem</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ignore_configure_endpoints_urls = true</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">endpoint_url = https://storage-tenant-01-obj-store-01.rainpole.io/</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[profile tenant01-shared-project]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">region = cork-region</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ca_bundle = /home/cormac/s3/ca-cert.pem</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ignore_configure_endpoints_urls = true</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">endpoint_url = https://storage-tenant-01-obj-store-01.rainpole.io/</span></pre>
<h4><strong>.aws/credentials</strong></h4>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[tenant01-default-project]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws_access_key_id = TWM9F73VC7HDK9VUJ0ND</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws_secret_access_key = IXE9vVPHzzaqGXMvh2yOPLDBDsc33heHBPfwjYdy</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[tenant01-shared-project]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws_access_key_id = 5XYCB3GMJIPPBYEI3KDB</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws_secret_access_key = hWzoJV5GaQ3W1ClWJQctsjCnYcTSc8hB68iX2CVN</span></pre>
<h2>Test bucket access</h2>
<p style="text-align: justify;">We can now try to simple commands to list the contents of the buckets. We can start with the <strong>tenant01</strong> LDAP user added to the default-project, and see if this user can use their default-project credentials to list the contents of their bucket in the default-project and then in the shared-project.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 ls s3://proj-admin-bucket-01-def-proj --summarize --human-readable --recursive \
--profile tenant01-default-project</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_151358.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_152130.csv</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Objects: 2</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Size: 264 Bytes</span></pre>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 ls s3://proj-admin-bucket-02-shared-proj --summarize --human-readable --recursive \
--profile tenant01-default-project</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws: [ERROR]: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access denied</span>
</pre>
<p style="text-align: justify;">As expected, they can only list bucket contents in the. default-project as that is the project that the credentials are associated with. Let&#8217;s try this the other way around, and check if the LDAP user tenant01, who is also a project admin in the shared-project, can access the bucket contents in the default-project.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ </span><strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws s3 ls s3://proj-admin-bucket-02-shared-proj --summarize --human-readable --recursive \
--profile tenant01-shared-project</span></strong>
<strong><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 14:42:21 26.4 KiB supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml</span></strong>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Objects: 1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Size: 26.4 KiB</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
$ <strong>aws s3 ls s3://proj-admin-bucket-01-def-proj --summarize --human-readable --recursive \
--profile tenant01-shared-project</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws: [ERROR]: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access denied</span></pre>
<p style="text-align: justify;">So as expected, the same issue occurs. The <strong>tenant01</strong> user who has credentials on the <em>default-project</em> cannot list objects in the <em>shared-project</em> since privileges on object storage are scoped at the project level. And vice-versa. The <strong>tenant01</strong> user who has credentials on the <em>shared-project</em> cannot list objects in the <em>default-project</em>. Let&#8217;s see how we can build a policy that will allow the default-project user <strong>tenant01</strong> access the <span style="font-family: 'courier new', courier, monospace;">proj-admin-bucket-02-shared-project</span> bucket created in <em>shared-project</em>.</p>
<h2 style="text-align: justify;">Build a bucket policy</h2>
<p style="text-align: justify;">To allow users from a remote project to access a bucket in a local bucket, a bucket policy must be created to allow it. The first thing you will need to retrieve before building a bucket policy is the account id of the project. We captured this in the table earlier. You can get this from the VCFA UI, as it is shown next to the Project name under the Native Object Storage view.</p>
<p>The default-project id is <strong>38925014951642977</strong>:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-def-389.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-full wp-image-33182" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-def-389.png?resize=506%2C150&#038;ssl=1" alt="" width="506" height="150" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-def-389.png?w=506&amp;ssl=1 506w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-def-389.png?resize=300%2C89&amp;ssl=1 300w" sizes="auto, (max-width: 506px) 100vw, 506px" /></a></p>
<p>The shared-project id is <strong>67271507534621802</strong>:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-shared-672.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-full wp-image-33183" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-shared-672.png?resize=488%2C143&#038;ssl=1" alt="" width="488" height="143" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-shared-672.png?w=488&amp;ssl=1 488w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/acc-id-shared-672.png?resize=300%2C88&amp;ssl=1 300w" sizes="auto, (max-width: 488px) 100vw, 488px" /></a></p>
<p style="text-align: justify;">You can use the aws cli to check that there is no existing bucket policy in place, making sure you use the correct credentials to do the query.</p>
<p style="text-align: justify;"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3api get-bucket-policy &#8211;bucket proj-admin-bucket-02-shared-proj \</strong><br />
<strong>&#8211;profile tenant01-shared-project</strong> </span><br />
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">aws: [ERROR]: An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist</span></p>
<p style="text-align: justify;">We now want to set a bucket policy that allows users from the default-project ( account id beginning 389 ) to access a bucket (<span style="font-family: 'courier new', courier, monospace;">proj-admin-bucket-02-shared-project)</span>in the shared-project. We can do this via the API /CLI or via Object Storage UI in VCF Automation. We want users from the remote project to be able to access the bucket read-only, so we are only allowing actions to list the bucket, get objects from the bucket and get the tags on these objects. We are not letting the remote users write anything to the bucket. The bucket policy, in JSON format, will look something like this:</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">{</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>"Version": "2012-10-17",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>"Statement": [{</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Sid": "AllowListBucket",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Effect": "Allow",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Principal": {</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>"AWS": "arn:aws:iam::38925014951642977:root"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>},</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Action": "s3:ListBucket",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Resource": "arn:aws:s3:::proj-admin-bucket-02-shared-proj"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>}, {</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Sid": "AllowGetObjects",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Effect": "Allow",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Principal": {</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>"AWS": "38925014951642977"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>},</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Action": ["s3:GetObject"],</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Resource": "arn:aws:s3:::proj-admin-bucket-02-shared-proj/*"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>}, {</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Sid": "AllowGetTags",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Effect": "Allow",</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Principal": {</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">            </span>"AWS": "arn:aws:iam::38925014951642977:root"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>},</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Action": ["s3:GetObjectTagging"],</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">        </span>"Resource": "arn:aws:s3:::proj-admin-bucket-02-shared-proj"</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><span class="Apple-converted-space">    </span>}]</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">}</span></pre>
<p style="text-align: justify;">Most of it is probably easy to understand, but the Principal might need a bit more explaining. Let&#8217;s break down the ARN in more detail:</p>
<ul>
<li>
<p style="text-align: justify;" data-path-to-node="4,0,0"><b data-path-to-node="4,0,0" data-index-in-node="0"><code data-path-to-node="4,0,0" data-index-in-node="0">arn:aws:</code></b> Amazon Resource Name (usually in the public AWS cloud).</p>
</li>
<li style="text-align: justify;">
<p data-path-to-node="4,1,0"><b data-path-to-node="4,1,0" data-index-in-node="0"><code data-path-to-node="4,1,0" data-index-in-node="0">iam:</code></b> The AWS service involved. In this case, Identity and Access Management.</p>
</li>
<li style="text-align: justify;">
<p data-path-to-node="4,2,0"><b data-path-to-node="4,2,0" data-index-in-node="0"><code data-path-to-node="4,2,0" data-index-in-node="0">38925014951642977:</code></b> The Account ID. <i data-path-to-node="4,2,0" data-index-in-node="49">(Note: Standard AWS account IDs are 12 digits long but ours are 17 digits).</i></p>
</li>
<li>
<p style="text-align: justify;" data-path-to-node="4,3,0"><b data-path-to-node="4,3,0" data-index-in-node="0"><code data-path-to-node="4,3,0" data-index-in-node="0">root</code></b> This does <b data-path-to-node="4,3,0" data-index-in-node="18">not</b> literally mean the root user. Instead, in a policy context, it acts as a placeholder for the <b data-path-to-node="4,3,0" data-index-in-node="175">entire account</b>. It basically <b data-path-to-node="11" data-index-in-node="54">delegates permission management</b> to the administrator of that target account. It means: <i data-path-to-node="11" data-index-in-node="141">&#8220;I trust this account. The administrator of that account can now use their own IAM policies to grant their specific IAM users / roles to my S3 bucket.&#8221;</i></p>
</li>
</ul>
<p style="text-align: justify;">To create this policy via the API, run the following aws cli commands, where <span style="font-family: 'courier new', courier, monospace; font-size: 12pt;">&#8211;policy file:// </span>points to the JSON file above:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3api put-bucket-policy --bucket proj-admin-bucket-02-shared-proj \</strong>
<strong>--policy file://enable-cross-bucket-iam-from-acc-38925014951642977-tenant01.json \</strong>
<strong>--profile tenant01-shared-project</strong></span></pre>
<p style="text-align: justify;">If no error is returned, the policy has successfully taken effect. If you want to do this via the VCFA UI, login to the Organization where the Object Store has been created. Go to Build &amp; Deploy &gt; Object Storage. Select the project where you wish to apply the bucket policy, e.g., <span style="font-family: 'courier new', courier, monospace;">shared-project</span>.  Click on the bucket to which the policy is to be applied. In this case, it is <span style="font-family: 'courier new', courier, monospace;">tenant-admin-bucket-02-shared-proj</span>. Select Policy, and the Click Here to apply a bucket policy. Click JSON, and paste the bucket policy content created earlier.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33196 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?resize=769%2C842&#038;ssl=1" alt="" width="769" height="842" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?w=819&amp;ssl=1 819w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?resize=274%2C300&amp;ssl=1 274w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?resize=768%2C841&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-json.png?resize=769%2C842&amp;ssl=1 769w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Apply the bucket policy via the UI by clicking on Save. After saving, click Expand All to see the policy details. Note that this view will be available either way &#8211; if you applied the policy via the API or UI, it will appear here:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-details.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33197 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-details.png?resize=740%2C919&#038;ssl=1" alt="" width="740" height="919" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-details.png?w=740&amp;ssl=1 740w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/bucket-policy-details.png?resize=242%2C300&amp;ssl=1 242w" sizes="auto, (max-width: 740px) 100vw, 740px" /></a></p>
<p style="text-align: justify;">Now use the aws cli once more to see if it the bucket policy has taken effect.<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;"><br />
</span></p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3api get-bucket-policy --bucket proj-admin-bucket-02-shared-proj \</strong>
<strong>--profile tenant01-shared-project</strong> 
{
"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AllowListBucket\",
\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::38925014951642977:root\"},
\"Action\":\"s3:ListBucket\",\"Resource\":\"arn:aws:s3:::proj-admin-bucket-02-shared-proj\"},
{\"Sid\":\"AllowGetObjects\",\"Effect\":\"Allow\","Principal\":{\"AWS\":\"arn:aws:iam::38925014951642977:root\"},
\"Action\":[\"s3:GetObject\"],\"Resource\":\"arn:aws:s3:::proj-admin-bucket-02-shared-proj/*\"},
{\"Sid\":\"AllowGetObjectTags\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::38925014951642977:root\"},
\"Action\":[\"s3:GetObjectTagging\"],\"Resource\":\"arn:aws:s3:::proj-admin-bucket-02-shared-proj/*\"}]}"
}
</span></pre>
<p style="text-align: justify;">This looks good. Now see if the LDAP user tenant01, i.e., the project admin user from the default-project, can list the contents of the bucket that has been created on the same object storage but in a different project.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 ls s3://proj-admin-bucket-02-shared-proj --summarize \</strong>
<strong>--human-readable --recursive --profile tenant01-default-project
</strong></span>2026-09-14 14:42:21 26.4 KiB supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml

Total Objects: 1
Total Size: 26.4 KiB</pre>
<p style="text-align: justify;">Success! The user from the default-project can list the bucket contents of the shared-project bucket which resides in a different project, something this user could not do before the bucket policy was applied. Let&#8217;s now try to copy the contents of the bucket in the shared-project to a bucket in the default-project.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 cp s3://proj-admin-bucket-02-shared-proj s3://proj-admin-bucket-01-def-proj \</strong>
<strong>--recursive --profile tenant01-default-project</strong>
copy: s3://proj-admin-bucket-02-shared-proj/supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml to s3://proj-admin-bucket-01-def-proj/supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml
</span></pre>
<p>Let&#8217;s check if the file made it over to the default-project bucket:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 ls s3://proj-admin-bucket-01-def-proj --summarize --human-readable \
--recursive --profile tenant01-default-project</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_151358.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_152130.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-16 09:06:38 26.4 KiB supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Objects: 3</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Size: 26.7 KiB</span></pre>
<p style="text-align: justify;">Once again, success! If you have some issues, you can run some commands to check that access to the local bucket is working as expected. One useful command is checking if it is possible to upload a simple local file to the destination bucket from the jump-box using your locla project credentials. This will verify that the user has credentials to write to the local bucket.</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>aws s3 ls s3://proj-admin-bucket-01-def-proj --profile tenant01-default-project</strong> 
</span><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_151358.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_152130.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-16 09:06:38 26.4 KiB supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Objects: 3</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Size: 26.7 KiB</span>


<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>echo "test" &gt; test.txt</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
$ <strong>aws s3 cp test.txt s3://proj-admin-bucket-01-def-proj/ --profile tenant01-default-project</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">upload: ./test.txt to s3://proj-admin-bucket-01-def-proj/test3.txt</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
$ <strong>aws s3 ls s3://proj-admin-bucket-01-def-proj --profile tenant01-default-project
</strong>2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_151358.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-14 09:47:53 132 Bytes credentials_admin_20260910_152130.csv</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-16 09:06:38 26.4 KiB supervisor-service-contour-legacy-v1.33.1_vmware.2-25276585.yml</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2026-09-16 09:11:41 5 Bytes test.txt</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Objects: 4</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Total Size: 26.7 KiB</span></pre>
<h2>Summary</h2>
<p style="text-align: justify;">Although still a tech preview in VMware Cloud Foundation version 9.1.1, Native Object Store has many production-ready features, especially around multi-tenancy. Whilst Object Storage is enabled at the scope of a Region, meaning that it is available to all organizations in a given region, the object stores themselves are organisation specific. Within an organisation, projects share the same underlying object store, but the access controls are set at the project level. As we have seen, an LDAP user who has been added to two projects may be allowed or denied access to the object store on a per project basis. Project Administrators decide which users are allowed to create, delete and access buckets, and the actions they can carry out on a bucket through the access control settings. Cross-Project bucket access can be also configured by a Project Admin through bucket policies, as seen above, to allow or deny remote access to buckets. Lots of nice granular controls in Native Object Storage.</p>
<p>The post <a href="https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/">Bucket Policies in VCFA 9.1.1 for Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/18/bucket-policies-in-vcfa-9-1-1-for-native-object-storage/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33177</post-id>	</item>
		<item>
		<title>Identity Providers and Access Controls in VCFA 9.1.1 for Native Object Storage</title>
		<link>https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/</link>
					<comments>https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 13:00:11 +0000</pubDate>
				<category><![CDATA[Native Object Storage]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[VSAN]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33117</guid>

					<description><![CDATA[<p>In a previous post, I highlighted how to get started with Native Object Storage which is in tech preview in VMware Cloud Foundation (VCF) version 9.1.1. In that post, we saw the role of the Provider Admin and the Organization Admin in VCF Automation (VCFA). We saw that the Provider Admin could create object storage on behalf of the tenant users within an organization, but could not actually create or view the buckets on the object store, nor see the access controls or anything else associated with the object store for that matter. We saw that the Org Admin had&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/">Identity Providers and Access Controls in VCFA 9.1.1 for Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-33151 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?resize=198%2C224&#038;ssl=1" alt="" width="198" height="224" /></a>In a previous post, I highlighted <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/" target="_blank" rel="noopener">how to get started with Native Object Storage</a> which is in tech preview in VMware Cloud Foundation (VCF) version 9.1.1. In that post, we saw the role of the Provider Admin and the Organization Admin in VCF Automation (VCFA). We saw that the Provider Admin could create object storage on behalf of the tenant users within an organization, but could not actually create or view the buckets on the object store, nor see the access controls or anything else associated with the object store for that matter. We saw that the Org Admin had to log in directly to the organization in order to be able to work with the Object Store. In this post, I want to look at the relationship between Object Storage and some other VCFA organization personas, such as the Project Admin and the Project Advanced User. We will add some users to VCFA using LDAP, give them a role in VCFA (organization users to begin with), and then give them roles in the project itself to see the different behaviours. The assumption is that Native Object Storage is already configured, so we will implement the following steps:</p>
<ol style="text-align: justify;">
<li>As the Provider Admin, configure LDAP as an Identity Provider</li>
<li>As an Provider Admin, add the &#8216;Provider&#8217; configured LDAP to an Organization</li>
<li>As an Org Admin, add LDAP user as an organization user</li>
<li>As an Org Admin, assign user a Project Admin role</li>
<li>As a Project Admin, observe Object Storage behaviour</li>
<li>As an Org Admin, create a new organization role to include additional object store privileges</li>
<li>As an Org Admin, change role of organization user (Project Admin)</li>
<li>As a Project Admin, login to organization and observe change in Object Storage behaviour</li>
<li>As an Org Admin, add a new LDAP user as organization user with additional object store privileges</li>
<li>As an Org Admin, assign Project Advanced User role to new LDAP user</li>
<li>As a Project Admin, assign Object Storage Access Controls to LDAP user</li>
<li>As an Project Advanced User, login to organization and observe Object Storage behaviour</li>
</ol>
<p style="text-align: justify;">At the end of this post, we should have a pretty good idea about how Native Object Storage access controls work for the different VCFA personas.</p>
<h2>Step 1: Configure LDAP/Active Directory  on Provider</h2>
<p style="text-align: justify;">Begin by configuring LDAP as an Identity Provider for VCFA as the Provider Admin. You may get a &#8216;trust certificate&#8217; popup similar to what I see here during testing. Once configured, it is worthwhile doing a quick test on some of the users to ensure you can query your LDAP Server / Active Directory successfully.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33120 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?resize=769%2C509&#038;ssl=1" alt="" width="769" height="509" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?resize=1024%2C678&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?resize=300%2C199&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?resize=768%2C508&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?resize=769%2C509&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.45.49.png?w=1068&amp;ssl=1 1068w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">To do a user test, click on the <strong>Test</strong> icon, provide the password of the user used to configure LDAP in the first place, and then add the LDAP/AD user that you want to test. This will return a list of attribute and whether or not the are configured. If you are happy that LDAP is working, we can proceed to the Organization where Object Storage is configured. Below is an example of a Test output, displaying which user attributes are configured and which are not.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.46.36.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33121" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.46.36.png?resize=512%2C577&#038;ssl=1" alt="" width="512" height="577" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.46.36.png?w=508&amp;ssl=1 508w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/Screenshot-2026-09-02-at-14.46.36.png?resize=266%2C300&amp;ssl=1 266w" sizes="auto, (max-width: 512px) 100vw, 512px" /></a></p>
<h2>Step 2: Configure LDAP on Organization</h2>
<p style="text-align: justify;">Login to your Organization as the Provider Admin. Select the <strong>Administer</strong> tab, and then select <strong>Identity Providers</strong>. Next, select LDAP and then the <strong>Configure</strong> button, as shown below.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33122 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?resize=769%2C474&#038;ssl=1" alt="" width="769" height="474" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?resize=1024%2C631&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?resize=300%2C185&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?resize=768%2C473&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?resize=769%2C474&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-select-LDAP.png?w=1172&amp;ssl=1 1172w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">In the LDAP source selection list, choose<strong> VCF Automation system LDAP service</strong>, which is what was configured in step 1. Add a distinguished name for the Org. Save the settings.</p>
<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33124" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?resize=769%2C505&#038;ssl=1" alt="" width="769" height="505" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?resize=1024%2C673&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?resize=768%2C504&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?resize=769%2C505&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-use-provider-ldap.png?w=1119&amp;ssl=1 1119w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Step 3: Import LDAP user as Organization User</h2>
<p style="text-align: justify;">Let&#8217;s import an LDAP user into our organization. You can do this as a Provider Admin, or you can log out and log in as the Org Admin. Return to the Administer section of the Organization but now select <strong>Access Control</strong> from the left hand menu list. At present there is only a single user, the tenant-03-admin. This is the first user that was added during the creation of the organization. Click on the <strong>Import Users</strong> button to add a new users from LDAP.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-import-users-1.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33125" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-import-users-1.png?resize=769%2C459&#038;ssl=1" alt="" width="769" height="459" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-import-users-1.png?w=633&amp;ssl=1 633w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-import-users-1.png?resize=300%2C179&amp;ssl=1 300w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">The Org Admin adds LDAP user &#8216;sadaf&#8217;. The Org Admin is also going to assign a role of &#8220;Organization User&#8221;. Click <strong>Import</strong>.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33126 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?resize=769%2C602&#038;ssl=1" alt="" width="769" height="602" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?resize=1024%2C801&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?resize=300%2C235&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?resize=768%2C601&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?resize=769%2C602&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-add-sadaf-with-org-user-privs.png?w=1086&amp;ssl=1 1086w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Step 4: Add LDAP user to Project as Project Admin</h2>
<p style="text-align: justify;">Now navigate to the Manage &amp; Govern tab in the Organization. Select Projects, then click on the Project (e.g., default-project) that you wish to assign users to.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.5-default-project.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-full wp-image-33128" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.5-default-project.png?resize=666%2C373&#038;ssl=1" alt="" width="666" height="373" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.5-default-project.png?w=666&amp;ssl=1 666w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.5-default-project.png?resize=300%2C168&amp;ssl=1 300w" sizes="auto, (max-width: 666px) 100vw, 666px" /></a></p>
<p style="text-align: justify;">Click on <strong>Users</strong>, then <strong>Add Users</strong>. In the Users list, type in the LDAP User that was previously added to the organization, i.e., &#8220;sadaf&#8221;. Assign a Project Role. In this case, &#8220;sadaf&#8221; is assigned the role of Project Administrator. Click Add, and then make sure you click on the <strong>Save</strong> button located at the bottom of the window. I have missed this on a number of occasions, so be sure to do that step.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-add-sadaf-to-project-as-admin.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-full wp-image-33127" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-add-sadaf-to-project-as-admin.png?resize=768%2C490&#038;ssl=1" alt="" width="768" height="490" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-add-sadaf-to-project-as-admin.png?w=768&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-add-sadaf-to-project-as-admin.png?resize=300%2C191&amp;ssl=1 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">Check the users on the project and ensure that user &#8216;sadaf&#8217; is listed as a Project Admin.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33130 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?resize=769%2C201&#038;ssl=1" alt="" width="769" height="201" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?resize=1024%2C268&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?resize=300%2C79&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?resize=768%2C201&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?resize=769%2C201&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-sadaf-is-proj-admin.png?w=1107&amp;ssl=1 1107w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Looks good. Let&#8217;s proceed to trying to manage Native Object Storage as a Project Admin.</p>
<h2>Step 5: Check Project Admin access to Native Object Storage</h2>
<p style="text-align: justify;">Log out of the organization as the provider admin / organization admin, and log back into this organization as &#8216;sadaf&#8217;, the Project Admin. From the Build &amp; Deploy tab, select Object Storage. You should now observe something identical to this &#8220;Unable to Load Object Stores&#8221; message:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33131" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=769%2C225&#038;ssl=1" alt="" width="769" height="225" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=1024%2C300&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=300%2C88&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=768%2C225&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=1536%2C451&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?resize=769%2C226&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-org-users-cannot-view-o-bj-stores.png?w=1650&amp;ssl=1 1650w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">The reason for this is because, in tech preview in version 9.1.1, the &#8220;Organization User&#8221; role does not have sufficient privileges to either View or Manage object storage. We are going to have to create a new organization role with additional privileges to access the object storage. Let&#8217;s do that next.</p>
<h2>Step 6: Create New Org Role with Object Storage Privileges</h2>
<p style="text-align: justify;">Log out of the tenant organization as the Project Admin and log back in as the Org Admin. Now, let&#8217;s take a look at the privileges associated with the Organization User. In the Organization, navigate to the Administer tab (which is only visible to Org Admins), and select Access Control once more from the left hand menu. Select <strong>Roles</strong>, then click on the Organization User to see the privileges/rights associated with that role. As you can see below there are no <strong>Object Store</strong> or <strong>vSAN Data Services</strong> privileges selected. Those are the ones needed for Object Storage.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33133 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?resize=769%2C464&#038;ssl=1" alt="" width="769" height="464" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?resize=1024%2C618&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?resize=300%2C181&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?resize=768%2C463&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?resize=769%2C464&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-privileges.png?w=1338&amp;ssl=1 1338w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">We can now go ahead and clone the organization user role to a new role where we can edit the privileges. In the role listing, click on the 3 dots in front of the Organization User roles and select <strong>Clone</strong>.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33134" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?resize=769%2C342&#038;ssl=1" alt="" width="769" height="342" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?resize=1024%2C455&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?resize=300%2C133&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?resize=768%2C341&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?resize=769%2C341&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/clone-org-user.png?w=1241&amp;ssl=1 1241w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Edit the new role, giving it a recognisable name, but more importantly, ensuring that the necessary <strong>Object</strong> <strong>Store</strong> and <strong>vSAN Data Service</strong> privileges are enabled. Note that in this case, I am selecting both management and view permissions. You may not want to do this, and instead only select View permissions for your Project Admins and Users. If you grant this role both sets of permissions, then anyone with this role will also be able to delete Object Stores in the Organisation, something you may not want to provide. Once the permsisions are selected, save this new Role.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33135 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?resize=769%2C582&#038;ssl=1" alt="" width="769" height="582" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?resize=1024%2C775&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?resize=300%2C227&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?resize=768%2C581&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?resize=769%2C582&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/org-user-with-obj-stor-privs.png?w=1033&amp;ssl=1 1033w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Step 7: Assign new role to LDAP User</h2>
<p style="text-align: justify;">Staying in Access Control, select the Users view. Click the three dots before user &#8216;sadaf&#8217; and select Edit. In the Assigned Roles section, remove the Organization User Role and add the new role with the object store privileges that you just cloned, in this case &#8220;Organization User with Object Store. Save the User settings.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33137" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?resize=768%2C618&#038;ssl=1" alt="" width="768" height="618" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?w=774&amp;ssl=1 774w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?resize=300%2C241&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?resize=768%2C618&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-sadaf-with-new-role.png?resize=769%2C619&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Now log back into the Organization as the Project Admin &#8216;sadaf&#8217; and see if the behaviour has changed with respect to Object Storage.</p>
<h2>Step 8: Observe change in Object Storage behaviour</h2>
<p style="text-align: justify;">Now when Project Admin &#8216;sadaf&#8217; logs into the organisation, navigates to Build &amp; Deploy, and then select Object Storage from the left hand menu, she is immediately offered an access key and secret. This is much better than previous behaviour. Keep in mind that this is because &#8216;sadaf&#8217; has already been added as a Project Admin to the default-project by the Org Admin, but now also has permissions to access to the object store. If multiple projects existed, and a different project other than default-project was selected, &#8216;sadaf&#8217; would not have access to the object storage from that project unless the Org Admin adds &#8216;sadaf&#8217; as a user to the project. &#8216;sadaf&#8217; has only been given access to the default-project and no other projects. <em>Access to the object store is scoped at the project level in VCF Automation</em>.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33138" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=769%2C355&#038;ssl=1" alt="" width="769" height="355" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=1024%2C473&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=300%2C139&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=768%2C355&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=1536%2C710&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?resize=769%2C356&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-Object-Store-view-with-new-role.png?w=1646&amp;ssl=1 1646w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">After saving the key and secret somewhere safe, and closing the welcome popup, the Project Admin can proceed with other activities, such as bucket creation and assigning additional project users access to the object storage.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33139" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=769%2C188&#038;ssl=1" alt="" width="769" height="188" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=1024%2C251&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=300%2C73&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=768%2C188&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=1536%2C376&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?resize=769%2C188&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-bucket-create-success.png?w=1646&amp;ssl=1 1646w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">A Project Admin has access to Security Credentials, Access Control and Service Accounts in this Project. As a Project Admin, this user &#8216;sadaf&#8217; can now control access to the Object Storage on behalf of other Project Users. Let&#8217;s look at that next.</p>
<h2>Step 9: Import a new LDAP User as Project Advanced User</h2>
<p style="text-align: justify;">We have already seen how to do this. This will have to be done as the Org Admin (or Provider Admin). It cannot be done by a Project Admin, as the Project Admin does not have access to the Administer tab (as you can see in the previous screenshot in step 8). This time, when importing the user &#8216;paudie&#8217; into the organization, ensure that the role is the org user + object storage privileges that we created earlier.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33141 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=769%2C408&#038;ssl=1" alt="" width="769" height="408" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=768%2C408&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=1536%2C815&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?resize=769%2C408&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-add-paudie-as-obj-store-priv.png?w=1649&amp;ssl=1 1649w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Step 10: Add new LDAP User as Project Advanced User</h2>
<p style="text-align: justify;">Next, add user &#8220;paudie&#8221; to the Project (default-project) as a Project Advanced User. This can be done by the Organization admin or as the Project admin.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33140" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?resize=769%2C232&#038;ssl=1" alt="" width="769" height="232" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?resize=1024%2C309&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?resize=300%2C91&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?resize=768%2C232&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?resize=769%2C232&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-paudie-added-as-proj-adv-user.png?w=1106&amp;ssl=1 1106w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Let&#8217;s login to the organisation and see if our newly added Project Advanced User &#8220;paudie&#8221; has access to the object store. The answer is no. They currently only have access to the Project, but not to Object Storage within the Project. Note that you are redirected to the Project Admin to resolve this access issue.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33142" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=769%2C365&#038;ssl=1" alt="" width="769" height="365" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=1024%2C486&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=768%2C365&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=1536%2C729&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?resize=769%2C365&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-no-perms-as-proj-adv-user-by-default.png?w=1649&amp;ssl=1 1649w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Step 11: Assign Object Storage Access Controls</h2>
<p style="text-align: justify;">Log out as Project Advanced User &#8216;paudie&#8217;, and login as Project Admin &#8216;sadaf&#8217;. Once logged in as a Project Admin, check the Access Controls associated with the Object Store. All policies and their users are displayed. As we can see, only the Org Admin (the first Org user created with the organisation) and user &#8221;sadaf&#8217; (Project Admin) have policies designed to give access to the object store in this project. Project Advanced User &#8216;paudie&#8217; does not have any access to the object store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33143 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=769%2C183&#038;ssl=1" alt="" width="769" height="183" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=1024%2C244&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=300%2C71&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=768%2C183&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=1536%2C365&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?resize=769%2C183&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-login-as-proj-adm-list-current-users.png?w=1648&amp;ssl=1 1648w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Project Admin &#8216;sadaf&#8217; can now go ahead and create some access rules for Project Advanced User &#8216;paudie&#8217;. We are not going to deal with granular rules here, but of course there are a range of actions that can be controlled, where we can grant or deny access to particular actions and to particular buckets. To keep things, simple, we are going to give the user &#8216;paudie&#8217; access to all actions on all buckets on this object store. Give the policy a name, select the user to which it applies, and then setup your statement to allow or deny actions on buckets. Then click Create. Below is an example of an access control policy where &#8216;paudie&#8217; is given access to all actions on all buckets on the object store in this project.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33144" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?resize=768%2C551&#038;ssl=1" alt="" width="768" height="551" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?w=979&amp;ssl=1 979w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?resize=300%2C215&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?resize=768%2C551&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-create-policy-for-paudie-full-access.png?resize=769%2C552&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">The policy will now be visible and can be viewed under Access Control. Note that this is only on the default-project only. This access control policy does not apply to other projects consuming the same object store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33145" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?resize=768%2C342&#038;ssl=1" alt="" width="768" height="342" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?w=881&amp;ssl=1 881w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?resize=300%2C133&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?resize=768%2C342&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-access-policy-detail.png?resize=769%2C342&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;"><strong>Side note</strong>: In the Resources section, we placed a wildcard &#8220;*&#8221; in that field, giving user &#8216;paudie&#8217; access to all buckets. If you simply wanted to give them access to a single bucket and its contents, replace the &#8220;*&#8221; with two ARN entries, e.g., <span style="font-family: 'courier new', courier, monospace;">arn:aws:s3:::your-bucket-name</span> and <span style="font-family: 'courier new', courier, monospace;">arn:aws:s3:::your-bucket-name/*</span>. This allows the user to have access to both the bucket and its contents. This is normally required for most use cases.</p>
<h2>Step 12: Observe change in Object Storage behaviour</h2>
<p style="text-align: justify;">Let&#8217;s log in to the organization once again as user &#8216;paudie&#8217; and see if access to the Object Storage has changed now that this user has been granted access control via a new policy.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33146" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=769%2C196&#038;ssl=1" alt="" width="769" height="196" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=1024%2C261&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=300%2C76&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=768%2C195&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=1536%2C391&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?resize=769%2C196&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-paudie-create-buckets-note-no-acess-control-.png?w=1647&amp;ssl=1 1647w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Success. Project Advanced User &#8216;paudie&#8217; can now access the object store, has access to buckets and can manage his own Security Credentials, i.e., create additional credentials. However, since this user is not a Project Admin, &#8216;paudie&#8217; does not have the ability to manage or change the Access Controls, nor does he have access to Service Accounts. These controls are only available to the Project Admin. Thus, user &#8216;paudie&#8217; is not able to onboard any more project users to enable them to access Object Storage. This has to be done by &#8216;sadaf&#8217; who has Project Admin privileges (or by the Organization admin).</p>
<h2>Summary</h2>
<p style="text-align: justify;">That completes the post. I hope it has gone some way to explain how VCF Automation roles and Project roles are used to implement Access Controls on Native Object Storage in the VCF 9.1.1 Technical Preview. This table should provide a useful recap. Note that many of the Org Admin tasks listed below could also be done by the Provider Admin:</p>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 11.1379%;"><strong>Role</strong></td>
<td style="width: 55.5287%;"><strong>Actions</strong></td>
</tr>
<tr>
<td style="width: 11.1379%;">Provider Admin</td>
<td style="width: 55.5287%;">
<ul>
<li><span style="font-size: 12pt;">Install &amp; Configure Native Object Storage</span></li>
<li><span style="font-size: 12pt;">Configure LDAP for VCF Private Cloud</span></li>
<li><span style="font-size: 12pt;">Create Object Stores for Organization (optional &#8211; delegate to Org Admin)</span></li>
<li><span style="font-size: 12pt;">Configure LDAP for Organization</span></li>
</ul>
</td>
</tr>
<tr>
<td style="width: 11.1379%;">Org Admin</td>
<td style="width: 55.5287%;">
<ul>
<li><span style="font-size: 12pt;">Create Object Stores for Organization</span></li>
<li><span style="font-size: 12pt;">Create Organization Role for Object Storage Users</span></li>
<li><span style="font-size: 12pt;">Import LDAP Users into Organization</span></li>
<li><span style="font-size: 12pt;">Assign Organization Role to LDAP Users</span></li>
<li><span style="font-size: 12pt;">Add Organization Users to Projects (optional &#8211; delegate to Project Admin)</span></li>
<li><span style="font-size: 12pt;">Create Access role for Project Users (optional &#8211; delegate to Project Admin)</span></li>
<li><span style="font-size: 12pt;">Create Projects (optional &#8211; delegate to Project Admin)</span></li>
<li><span style="font-size: 12pt;">Add Organization Users to Projects (optional &#8211; delegate to Project Admin)</span></li>
<li><span style="font-size: 12pt;">Create Access role for Project Users  (optional &#8211; delegate to Project Admin)</span></li>
<li><span style="font-size: 12pt;">Create and Consume buckets</span></li>
<li><span style="font-size: 12pt;">Create Security Credentials</span></li>
</ul>
</td>
</tr>
<tr>
<td style="width: 11.1379%;">Project Admin</td>
<td style="width: 55.5287%;">
<ul>
<li><span style="font-size: 12pt;">Create Projects</span></li>
<li><span style="font-size: 12pt;">Add Organization Users to Projects</span></li>
<li><span style="font-size: 12pt;">Create Access role for Project Users</span></li>
<li><span style="font-size: 12pt;">Create and Consume buckets</span></li>
<li><span style="font-size: 12pt;">Create Security Credentials</span></li>
</ul>
</td>
</tr>
<tr>
<td style="width: 11.1379%;">Project Advanced User</td>
<td style="width: 55.5287%;">
<ul>
<li><span style="font-size: 12pt;">Create and Consume Buckets</span></li>
<li><span style="font-size: 12pt;">Create Security Credentials</span></li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>The post <a href="https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/">Identity Providers and Access Controls in VCFA 9.1.1 for Native Object Storage</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/16/identity-providers-and-access-controls-in-vcfa-9-1-1-for-native-object-storage/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33117</post-id>	</item>
		<item>
		<title>SQL Server enhancements in Data Services Manager version 9.1.1</title>
		<link>https://cormachogan.com/2026/09/14/sql-server-enhancements-in-data-services-manager-version-9-1-1/</link>
					<comments>https://cormachogan.com/2026/09/14/sql-server-enhancements-in-data-services-manager-version-9-1-1/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Mon, 14 Sep 2026 08:13:50 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[Data Services Manager. DSM]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[MS SQL Server for Linux]]></category>
		<category><![CDATA[TDE]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33070</guid>

					<description><![CDATA[<p>VMware introduced support for Microsoft SQL Server as a data service in VMware Data Services Manager version 9.1. In version 9.1.1, there are a number of enhancements, some of which I will highlight in this post. If you want to get the full list of enhancements, check out the VMware Data Services Manager 9.1.1. Release Notes. One of the major changes in version 9.1.1 is to enable the VCF Automation (VCFA) Provider Administrators to provision the SQL Server instances / engines directly from VCFA, rather than context switching back to the DSM UI to do it. Once the SQL Server&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/14/sql-server-enhancements-in-data-services-manager-version-9-1-1/">SQL Server enhancements in Data Services Manager version 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class=" wp-image-30383 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=151%2C122&#038;ssl=1" alt="" width="151" height="122" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=1024%2C831&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=300%2C244&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=768%2C623&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=769%2C624&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?w=1386&amp;ssl=1 1386w" sizes="auto, (max-width: 151px) 100vw, 151px" /></a>VMware introduced support for Microsoft SQL Server as a data service in VMware Data Services Manager version 9.1. In version 9.1.1, there are a number of enhancements, some of which I will highlight in this post. If you want to get the full list of enhancements, check out the <a href="https://techdocs.broadcom.com/us/en/vmware-cis/dsm/data-services-manager/9-1/release-notes/vmware-data-services-manager-911-release-notes.html" target="_blank" rel="noopener">VMware Data Services Manager 9.1.1. Release Notes.</a> One of the major changes in version 9.1.1 is to enable the VCF Automation (VCFA) Provider Administrators to provision the SQL Server instances / engines directly from VCFA, rather than context switching back to the DSM UI to do it. Once the SQL Server instance is deployed, data service policies can be created to allow the tenant users in different organization to provision SQL Server databases on the SQL Server instances to which their organization has access.</p>
<p style="text-align: justify;">Other enhancements include setting an AD user as the  SQL Server admin rather than a SQL user, and support for gMSA &#8211; Group Managed Service Accounts &#8211; to perform group refreshes and group membership of users. The latter feature is interesting as gMSAs improves security. gMSAs automatically generating complex, 128-character passwords for the account and rotate it automatically every 30 days (by default). Using a gMSA in place of a normal AD account also get automatically granted permissions to manage its own Service Principal Names (SPNs). When the SQL Server engine starts, a gMSA can automatically register and unregister its SPN.</p>
<h2>gMSA Support</h2>
<p style="text-align: justify;">Let&#8217;s look at how to set up a gMSA account during the creation of a SQL Server Instance through VCFA in more detail. This first screenshot shows where to create the SQL Server instances in VCF Automation. When you are logged into VCFA as a Provider Admin, navigate to the VCF Services &gt; Data Services Manager in the navigation toolbar on the left hand side. As you can see, the user experience has changed quite a bit from the previous release, so take some time to familiarise yourself with it.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33071 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=769%2C173&#038;ssl=1" alt="" width="769" height="173" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=1024%2C230&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=300%2C67&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=768%2C173&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=1536%2C346&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?resize=769%2C173&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-create-sql-servers-in-vcfa.png?w=1636&amp;ssl=1 1636w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">During the creation of a new SQL Server instance, you can now select to have a SQL user or an Active Directory user as the SQL Server administrator. If you choose a Windows Principal (AD user), provide the domain name as well as the user name, as shown below.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33072" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?resize=768%2C520&#038;ssl=1" alt="" width="768" height="520" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?w=831&amp;ssl=1 831w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?resize=300%2C203&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?resize=768%2C520&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-AD-user-as-Admin.png?resize=769%2C521&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">In the next section on Active Directory, a gMSA may be selected in place of an AD user account to handle database access. If gMSA is selected, then the AD Account Username must be populated with the gMSA &#8216;SamAccountName&#8217;. In many case, the SamAccountName has a trailing &#8216;$&#8217; sign, and this must be included. gMSAs automatically have privileges to Write Service Principal Names so this field is automatically set to on as is not configurable. You can still use the account to Write DNS Names, but you must ensure that your privileged used added to the gMSA has this privilege in Active Directory.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33073" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?resize=768%2C843&#038;ssl=1" alt="" width="768" height="843" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?w=891&amp;ssl=1 891w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?resize=273%2C300&amp;ssl=1 273w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?resize=768%2C843&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-gMSA.png?resize=769%2C844&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">If you want to test gMSA, here are the steps that I followed to create such as account in my active directory. These were run from a PowerShell window which I had opened with &#8216;Run as Administrator&#8217; privileges:</p>
<h4>1. Check that a Key Distribution Service (KDS) Root Key exists</h4>
<p style="text-align: justify;">Active Directory requires a Key Distribution Service (KDS) Root Key to generate encrypted gMSA passwords. Check to see if one exists. If it does not, you will have to create one.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>Get-KdsRootKey</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">AttributeOfWrongFormat :</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">KeyValue <span class="Apple-converted-space">              </span>: {74, 163, 251, 83...}</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">EffectiveTime<span class="Apple-converted-space">          </span>: 3/13/2026 11:30:05 PM</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">CreationTime <span class="Apple-converted-space">          </span>: 3/14/2026 9:30:05 AM</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">IsFormatValid<span class="Apple-converted-space">          </span>: True</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">DomainController <span class="Apple-converted-space">      </span>: CN=ARKHAM-DC01,OU=Domain Controllers,DC=arkham,DC=io</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ServerConfiguration<span class="Apple-converted-space">    </span>: Microsoft.KeyDistributionService.Cmdlets.KdsServerConfiguration</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">KeyId<span class="Apple-converted-space">                  </span>: 6b591c9e-7676-59cf-6d44-bb745f0040a0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">VersionNumber<span class="Apple-converted-space">          </span>: 1</span></pre>
<h4 class="sequence-event-title gds-emphasized-body-l">2. Create a Security Group</h4>
<div class="sequence-event-subtitle gds-extended-caption ng-star-inserted" style="text-align: justify;">First, create an Active Directory security. This group will contain objects allowed to retrieve the gMSA password. The &#8220;`&#8221; allows the PowerShell command to follow-on to the next line.</div>
<div>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>New-ADGroup -Name "CJH-gMSA-Hosts" `
-GroupScope Global -GroupCategory Security</strong></span></pre>
</div>
<h4 class="sequence-event-title gds-emphasized-body-l">3. Create the gMSA Identity</h4>
<p class="ng-star-inserted" style="text-align: justify;">Create the actual gMSA account in Active Directory and assign the group permission to access its credentials. Note that the DNS Hostname can be anything in the following command:</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>New-ADServiceAccount -Name "cjh_sql_gmsa" `
-DNSHostname "cjh_sql_gmsa.arkham.io" `
-PrincipalsAllowedToRetrieveManagedPassword "CJH-gMSA-Hosts"</strong></span></pre>
<h4 style="text-align: justify;">4. Check that it the group managed service account was created successfully:</h4>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>Get-ADServiceAccount -Identity "cjh_sql_gmsa"</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">DistinguishedName : CN=cjh_sql_gmsa,CN=Managed Service Accounts,DC=arkham,DC=io</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Enabled <span class="Apple-converted-space">          </span>: True</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Name<span class="Apple-converted-space">              </span>: cjh_sql_gmsa</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ObjectClass <span class="Apple-converted-space">      </span>: msDS-GroupManagedServiceAccount</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ObjectGUID<span class="Apple-converted-space">        </span>: 890010fb-1b49-47d4-b2dc-552dc64e9bc0</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SamAccountName<span class="Apple-converted-space">    </span>: cjh_sql_gmsa$</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SID <span class="Apple-converted-space">              </span>: S-1-5-21-388335747-1197595944-2956950382-1608</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">UserPrincipalName :</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>(Get-ADServiceAccount -Identity "cjh_sql_gmsa" `
-Properties "msDS-GroupMSAMembership").'msDS-GroupMSAMembership'.access</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ActiveDirectoryRights : GenericAll</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">InheritanceType <span class="Apple-converted-space">      </span>: None</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ObjectType<span class="Apple-converted-space">            </span>: 00000000-0000-0000-0000-000000000000</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">InheritedObjectType <span class="Apple-converted-space">  </span>: 00000000-0000-0000-0000-000000000000</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ObjectFlags <span class="Apple-converted-space">          </span>: None</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">AccessControlType <span class="Apple-converted-space">    </span>: Allow</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">IdentityReference <span class="Apple-converted-space">    </span>: ARKHAM\CJH-gMSA-Hosts</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">IsInherited <span class="Apple-converted-space">          </span>: False</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">InheritanceFlags<span class="Apple-converted-space">      </span>: None</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PropagationFlags<span class="Apple-converted-space">      </span>: None</span></pre>
<h4 class="sequence-event-subtitle gds-extended-caption ng-star-inserted" style="text-align: justify;">5. Add your privileged AD user to the list of Group Members</h4>
<div class="sequence-event-subtitle gds-extended-caption ng-star-inserted" style="text-align: justify;">In my case, my privileged AD user is &#8216;cormac&#8217;. This is the same account that I used to add the Active Directory Domain to DSM so it can be used with SQL Server deployments. This account needs to have many privileges for a range of different tasks. It has to be able to write &#8220;servicePrincipalNames&#8221; for the auto-registration, it needs &#8220;create object/set owner&#8221; for the DNS writes and it needs to read the managed password of a gMSA (which is held as a list on the gMSA). For this managed password privilege, the domain&#8217;s privileges account must be added to that list for every gMSA you create.</div>
<div></div>
<div><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33077 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?resize=769%2C252&#038;ssl=1" alt="" width="769" height="252" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?resize=1024%2C336&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?resize=300%2C98&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?resize=768%2C252&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?resize=769%2C252&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-AD-Config.png?w=1320&amp;ssl=1 1320w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></div>
<div>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>Add-ADGroupMember-Identity "CJH-gMSA-Hosts" -Members "cormac"</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>Get-ADGroupMember-Identity "CJH-gMSA-Hosts"</strong></span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">distinguishedName : CN=cormac,CN=Users,DC=arkham,DC=io</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">name: cormac</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">objectClass : user</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">objectGUID: b5a2bd65-8832-469b-b278-8fa2fa6fcaea</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SamAccountName: cormac</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SID : S-1-5-21-388335747-1197595944-2956950382-1602</span></pre>
</div>
<h4 style="text-align: justify;">6. Test the gMSA.</h4>
<p style="text-align: justify;">This command should return True. If there is a misconfiguration, this should report back the reason why.</p>
<pre class="p1"><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">PS C:\Users\Administrator&gt; <strong>Test-ADServiceAccount -Identity "cjh_sql_gmsa"</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">True</span></pre>
<p style="text-align: justify;">The account is now ready to be used when provisioning SQL Server instances via DSM Manager.</p>
<h2>Encrypted Backup and Transparent Data Encryption</h2>
<p style="text-align: justify;">I already mentioned some of these new SQL Server features in <a href="https://cormachogan.com/2026/09/04/announcing-vmware-data-services-manager-9-1-1/" target="_blank" rel="noopener">my DSM version 9.1.1 announcement post</a>, but some are worth repeating here as I know a number of customers have requested them. We have now validated Backup Encryption and TDE, Transparent Data Encryption, on DSM provisioned SQL Server databases. Both features are available through the API. Encrypted Backups can be activated by adding a PFX file to the SQL Server instance specification. This PFX (Personal Information Exchange) file is password-protected and contains the SSL/TLS public key certificate and its matching private key. It is added to the <span style="font-family: 'courier new', courier, monospace;">spec.serverConfig.certificates</span> of the SQL Server instance, and then referenced via <span style="font-family: 'courier new', courier, monospace;">spec.serverConfig.backupEncryptionCertificate</span>. All databases created on the SQL Server instance will now have encrypted backups if this is configured. Note that if you wish to restore an encrypted database to a new SQL Server instance, the same certificate used to encrypt the backup must be imported onto the target SQL Server instance.</p>
<p style="text-align: justify;">Transparent Data Encryption also requires adding a certificate to the specification of the SQL Server instance, <span style="font-family: 'courier new', courier, monospace;">spec.serverConfig.certificates</span>, as seen previously. Then, on the user database, the db_owner (database owner) can use TSQL commands to create an encryption key. Finally, the db_owner can turn on encryption by performing ALTER DATABASE .. SET ENCRYPTION ON.</p>
<h2>Summary</h2>
<p style="text-align: justify;">I haven&#8217;t discussed some other important improvements such as support for SQL Server 2025 and on-demand backup for SQL Server databases. However, as mentioned at the outset, you will find the full set of enhancements in the release notes linked above. I am sure you will agree that this release contains plenty of SQL Server enhancements for those customers wishing to provide SQL Server Database as a Service (DBaaS) to their on-premises VMware Cloud Foundation customers.</p>
<p>The post <a href="https://cormachogan.com/2026/09/14/sql-server-enhancements-in-data-services-manager-version-9-1-1/">SQL Server enhancements in Data Services Manager version 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/14/sql-server-enhancements-in-data-services-manager-version-9-1-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33070</post-id>	</item>
		<item>
		<title>Data Services Manager version 9.1.1 Network Security</title>
		<link>https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/</link>
					<comments>https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Thu, 10 Sep 2026 13:00:55 +0000</pubDate>
				<category><![CDATA[Data Services Manager]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[Data Services Manager. DSM]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33047</guid>

					<description><![CDATA[<p>One of the interesting new features of VMware Data Services Manager when it is integrated with VCF automation is the Network Security feature. In a nutshell, what this feature does is implement both distributed firewall rules and gateway firewall rules for each DSM database deployed via VCF Automation. Let&#8217;s take a closer look. By default, Net work Security is disabled. The VCFA Provider Admin will need to activate it. Navigate to VCF Services &#62; Data Services. In the Data Services Manager menu, select Advanced. Here you will find the button to activate Network Security. When the Activate button is clicked,&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/">Data Services Manager version 9.1.1 Network Security</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignleft wp-image-30383 " src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=151%2C122&#038;ssl=1" alt="" width="151" height="122" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=1024%2C831&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=300%2C244&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=768%2C623&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?resize=769%2C624&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2023/01/dsm-logo-icon.png?w=1386&amp;ssl=1 1386w" sizes="auto, (max-width: 151px) 100vw, 151px" /></a>One of the interesting new features of VMware Data Services Manager when it is integrated with VCF automation is the Network Security feature. In a nutshell, what this feature does is implement both distributed firewall rules and gateway firewall rules for each DSM database deployed via VCF Automation. Let&#8217;s take a closer look.</p>
<p style="text-align: justify;">By default, Net work Security is disabled. The VCFA Provider Admin will need to activate it. Navigate to VCF Services &gt; Data Services. In the Data Services Manager menu, select Advanced. Here you will find the button to activate Network Security.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33049 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=769%2C279&#038;ssl=1" alt="" width="769" height="279" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=1024%2C371&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=300%2C109&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=768%2C278&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=1536%2C556&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?resize=769%2C278&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/1.-dsm-net-sec-1.png?w=1751&amp;ssl=1 1751w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">When the Activate button is clicked, a pop-up will appear explaining what Network Security is setting out to do. It is basically going to implement a set of rules so that only the tenant that requested the database is able to access &#8220;from that tenant&#8221;. It cannot be access from any other tenant, or from an external ip address outside of VCF. It will do this by implementing a set of gateway and distributed firewall rules on the dedicated DSM organization where the database instance is instantiated.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33050 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?resize=769%2C284&#038;ssl=1" alt="" width="769" height="284" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?resize=1024%2C378&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?resize=300%2C111&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?resize=768%2C283&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?resize=769%2C284&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/2.-dsm-net-sec-2.png?w=1509&amp;ssl=1 1509w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Now, do note that by default, Transit Gateway (TGW) Firewalls are disabled. Therefore either the DSM Org Admin or the Provider Admin will need to open the DSM Org and enable the Transit Gateway Firewall. A shortcut to this point is to simply click on the &#8220;Manage Rules&#8221; link found in the Advanced View of the Data Services Manager Network Security section show above. If you fail to enable the TGW firewall step, the gateway rules will not be implemented and will be left in an &#8220;In Progress&#8221; state, as shown here:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33051 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=769%2C375&#038;ssl=1" alt="" width="769" height="375" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=1024%2C500&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=768%2C375&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=1536%2C750&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?resize=769%2C375&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/3.-dsm-net-gw-off.png?w=1751&amp;ssl=1 1751w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">To turn on the Transit Gateway Firewall, select the Settings tab, select the region and turn the firewall on.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33052 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=769%2C228&#038;ssl=1" alt="" width="769" height="228" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=1024%2C304&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=300%2C89&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=768%2C228&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=1536%2C456&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?resize=769%2C228&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/4.-dsm-net-turn-on-gw.png?w=1737&amp;ssl=1 1737w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Once the Gateway Firewall is enabled, the state should change to Success and any existing DSM provisioned databases should have their ruleset added to the firewalls on the dedicated DSM Org. Below are the transit gateway rules which only allow the configured IP addresses (Supervisor Control Plane VMs and DSM Provider) to communicate to the K8s API server of the database, and only allow the SNAT&#8217;ed IP address of the tenant ORG to communicate to the database port.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33054" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=769%2C348&#038;ssl=1" alt="" width="769" height="348" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=1024%2C464&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=300%2C136&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=768%2C348&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=1536%2C697&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?resize=769%2C349&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/5.-gw-rules.png?w=1755&amp;ssl=1 1755w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">So far, so good. Now let&#8217;s assume that someone outside of that tenant&#8217;s org wishes to access the database. Maybe it is an app running somewhere else on the infrastructure. In that case, all you have to do is to add the External IP Address to the database configuration, as shown here:</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33056 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?resize=769%2C621&#038;ssl=1" alt="" width="769" height="621" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?w=1017&amp;ssl=1 1017w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?resize=300%2C242&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?resize=768%2C620&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/7.-extra-clients.png?resize=769%2C621&amp;ssl=1 769w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">And once the database reconciles with the new external client ip address, a new Transit Gateway Rule will be in place to allow the connection to succeed. As shown below, this is added to the list of IP addresses that can access the Postgres database but not the list of IP addresses that are allowed to access the database&#8217;s K8s API server.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33057" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=769%2C293&#038;ssl=1" alt="" width="769" height="293" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=1024%2C390&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=300%2C114&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=768%2C293&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=1536%2C586&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?resize=769%2C293&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/08/8.-gw-rules-change.png?w=1626&amp;ssl=1 1626w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">And to verify that we can now connect to the database from that IP address, run the following:</p>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">$ <strong>ip -f inet address show ens33</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">altname enp2s1</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">inet 10.13.10.200/24 brd 10.13.10.255 scope global ens33</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">valid_lft forever preferred_lft forever</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">
$ <strong>psql postgresql://pgadmin:43ux4ZwihNYooae00gUn5404ygLr0R@192.168.21.14:5432/ten2-pgdb</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">psql (16.15 (Ubuntu 16.15-0ubuntu0.24.04.1), server 16.14 (VMware Postgres 16.14.0))</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Type "help" for help.</span>

<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ten2-pgdb=# <strong>\c</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">psql (16.15 (Ubuntu 16.15-0ubuntu0.24.04.1), server 16.14 (VMware Postgres 16.14.0))</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">You are now connected to database "ten2-pgdb" as user "pgadmin".</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">ten2-pgdb=#</span></pre>
<p style="text-align: justify;">Everything looks good. The rules are allowing me to connect to the database from an external IP address.</p>
<p style="text-align: justify;">A note about remote replication. If remote replication is configured on a database and the read replica and the primary instances are in different regions, you must manually authorise the network for connectivity. Edit the Primary database &#8220;Extra Clients&#8221; field like we did earlier and add the SNAT IP of the organization VPC where the read replica instance is created. Now perform the same action on the read replica database, adding the SNAT IP of the organization VPC where the primary instance was created as an &#8220;Extra Client&#8221;. This will enable data synchronisation and ready it for both read scale out and disaster recovery scenarios.</p>
<p>The post <a href="https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/">Data Services Manager version 9.1.1 Network Security</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/10/data-services-manager-version-9-1-1-network-security/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33047</post-id>	</item>
		<item>
		<title>A first look at Native Object Storage in VCF 9.1.1</title>
		<link>https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/</link>
					<comments>https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Cormac]]></dc:creator>
		<pubDate>Tue, 08 Sep 2026 13:00:17 +0000</pubDate>
				<category><![CDATA[Native Object Storage]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[VCF Automation]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Cloud Foundation (VCF)]]></category>
		<category><![CDATA[VSAN]]></category>
		<category><![CDATA[vSphere]]></category>
		<category><![CDATA[9.1.1]]></category>
		<category><![CDATA[VCF]]></category>
		<category><![CDATA[VCFA]]></category>
		<guid isPermaLink="false">https://cormachogan.com/?p=33083</guid>

					<description><![CDATA[<p>Many readers may have read this blog article on Native Object Storage from my good pal, Pete Koehler. In that post, which was published back in May of this year and coincided with the VMware Cloud Foundation (VCF) version 9.1 release, Pete talked about a tech preview of Native Object Storage. Well, with the release of VCF 9.1.1, the tech preview has now begun. Although the tech preview of Native Object Storage is not open to everybody, we will be working with a select set of customers and gathering critical feedback. Our objective is to have a robust Native Object&#8230;</p>
<p>The post <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/">A first look at Native Object Storage in VCF 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-33151 alignleft" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/native-object-storage.webp?resize=198%2C224&#038;ssl=1" alt="" width="198" height="224" /></a>Many readers may have read <a href="https://blogs.vmware.com/cloud-foundation/2026/05/13/native-s3-compatible-object-storage-in-vmware-vsan-for-vcf-9-1/" target="_blank" rel="noopener">this blog article</a> on Native Object Storage from my good pal, Pete Koehler. In that post, which was published back in May of this year and coincided with the VMware Cloud Foundation (VCF) version 9.1 release, Pete talked about a tech preview of Native Object Storage. Well, with the release of VCF 9.1.1, the tech preview has now begun. Although the tech preview of Native Object Storage is not open to everybody, we will be working with a select set of customers and gathering critical feedback. Our objective is to have a robust Native Object Storage platform when it does become generally available to all our customers. For customers who may not be part of the tech preview, this post should give you an appreciation of how we have integrated Object Storage into VCF.</p>
<p style="text-align: justify;">In this post, I wanted to share some of the setup and initial configuration steps so that you can see what&#8217;s involved. I&#8217;ll show you how a Provider Admin enables Object Storage on their VCF Private Cloud. Next, we will see how either the Provider Admin or the Org Admin creates the Object Stores. Finally, I&#8217;ll take you to the point where tenant users in a VCF Automation organization can begin to provision their own S3 compatible buckets. In a future post, we&#8217;ll look at how a Project Admin can configure access control to the object storage buckets for different project users and assign different levels of privileges to the different project users.</p>
<p style="text-align: justify;">Be aware that by the time the service is generally available, the screenshots shown here may have changed. This post is simply to provide an overview, in the knowledge that the steps may be different in future releases.</p>
<h2>Prep vCenter and ESXi</h2>
<p style="text-align: justify;">For the tech preview, you will need to enable some advanced options on both ESXi and vCenter to enable Object Storage. You won&#8217;t need this step when Native Object Storage is generally available, but for the tech preview, you will need to enable these settings manually.</p>
<h4>1. ESXi &#8211; set /VSAN/VsanVBOSSEnabled to 1</h4>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[root@sfo01-w01-r01-esx01:~] <strong>esxcfg-advcfg -g /VSAN/VsanVBOSSEnabled</strong>
Value of VsanVBOSSEnabled is 0
[root@sfo01-w01-r01-esx01:~] <strong>esxcfg-advcfg -s 1 /VSAN/VsanVBOSSEnabled</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Value of VsanVBOSSEnabled is 1</span></pre>
<h4>2. ESXi &#8211; restart vsanmgmtd</h4>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[root@sfo01-w01-r01-esx01:~] <strong>/etc/init.d/vsanmgmtd restart</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Terminating vsanperfsvc with PID 2561654</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">vsanperfsvc stopped.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">vsanperfsvc started.</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[root@sfo01-w01-r01-esx01:~] <strong>/etc/init.d/vsanmgmtd status</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">vsanperfsvc is running</span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">[root@sfo01-w01-r01-esx01:~]
</span></pre>
<h4>3. vCenter &#8211; enable Advanced Setting config.vpxd.vsan.vboss.enabled</h4>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33087 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?resize=769%2C430&#038;ssl=1" alt="" width="769" height="430" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?resize=1024%2C572&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?resize=300%2C167&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?resize=768%2C429&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?resize=769%2C429&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.0-enable-vcenter.png?w=1064&amp;ssl=1 1064w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h4>4. vCenter &#8211; restart vsan-health</h4>
<pre><span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">root@sfo-w01-vc01 [ ~ ]# <strong>vmon-cli -r vsan-health</strong></span>
<span style="font-family: 'courier new', courier, monospace; font-size: 10pt;">Completed Restart service request.</span></pre>
<h2>Download &amp; Install Native Object Store Package</h2>
<p style="text-align: justify;">Tech preview customers will be provided with a run-book to step through how to download the necessary Native Object Storage package. You will need a Linux jump host. Once downloaded, the components need to be pushed up to VCF Automation VMSP Platform. Once that step is completed, tech preview customers can proceed with the installation of the Native Object Storage Service.</p>
<p style="text-align: justify;">Note, however, that you will first need to create a Region object in VCF Automation. Native Object Storage is scoped at a region level, and one or more regions need to be selected when Native Object Storage is installed. The following section has some more specifics on Region settings.</p>
<p style="text-align: justify;">To proceed with the installation, the VCFA Provider Admin used a new Native Object Store tile found under Services Management, as shown below. However, this tile is hidden in VCF 9.1.1 and only those customers participating in the tech preview will be provided with the steps to make it visible. Once the backend components for Object Storage are added to VCF, the VCF Automation Service Management tile for Native Object Storage can be used to do the registration and installation of the service at the Supervisor level.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33086" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?resize=769%2C411&#038;ssl=1" alt="" width="769" height="411" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?resize=1024%2C547&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?resize=300%2C160&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?resize=768%2C410&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?resize=769%2C411&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/0.-oss-tile.png?w=1367&amp;ssl=1 1367w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">With Native Object Storage installed, a new supervisor namespace called &#8216;svc-objectstore-xxx&#8217; is created. In this namespace, the Native Object Storage operator is deployed, watching for requests from different VCFA organisations to build object stores.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33090" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?resize=769%2C182&#038;ssl=1" alt="" width="769" height="182" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?resize=1024%2C243&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?resize=300%2C71&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?resize=768%2C182&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?resize=769%2C182&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/5.-oss-controller.png?w=1447&amp;ssl=1 1447w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">The operator has two network services associated with it, compatibility-api and controller manager.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?ssl=1"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter size-large wp-image-33091" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?resize=769%2C150&#038;ssl=1" alt="" width="769" height="150" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?resize=1024%2C200&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?resize=300%2C59&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?resize=768%2C150&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?resize=769%2C150&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/6.-oss-setup-network.png?w=1449&amp;ssl=1 1449w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Once the install is complete, we can proceed with getting it ready for the tenant organizations.</p>
<h2>VCFA Region Settings</h2>
<p style="text-align: justify;">I mentioned previously that Native Object Storage is scoped at the region level. Thus, at least one region must exist before starting the installation. The region is comprised of one or more Supervisors, backed by one or more vSphere clusters. There must be a vSAN cluster on at least one of the vSphere clusters to enable Native Object Storage. The main item to ensure is selected in the region settings is the vSAN Object Store Policy in the Storage Class settings. This is the storage class which is used to create object store volumes on vSAN, both for the metadata and for the data.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33089 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?resize=769%2C216&#038;ssl=1" alt="" width="769" height="216" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?resize=1024%2C288&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?resize=300%2C84&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?resize=768%2C216&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?resize=769%2C216&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/1.-oss-setup-region-.png?w=1328&amp;ssl=1 1328w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Note that there is no capability to choose which organization gets access to object storage in the 9.1.1 tech preview. If an organization is using a region quota from a region which is scoped to use the Native Object Storage, then that organization has the ability to create an object store.</p>
<p style="text-align: justify;">Also note that if your region is a multi-zone, for example, the Supervisor is backed by multiple vSphere/vSAN clusters, the object store will only provision to the cluster placed in the first zone in the list. Tech Preview does not allow the provisioning of object storages across multiple zones.</p>
<h2>VCFA Organization Settings</h2>
<p style="text-align: justify;">Once we have confirmed that the region does indeed include the vSAN Object Store Policy, we can proceed with the creation of the organizations. The organization region quota includes the vSAN Object Storage Policy.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33092 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?resize=769%2C496&#038;ssl=1" alt="" width="769" height="496" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?resize=1024%2C661&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?resize=300%2C194&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?resize=768%2C496&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?resize=769%2C496&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/2.-org-setup-region-quota.png?w=1319&amp;ssl=1 1319w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">There will probably be many questions about networking when it comes to Native Object Storage. Whilst different configuration are possible, I am going to keep the Object Store and the tenant on the same VPC. When creating this organization, I am selecting a network configuration whereby a number of default configuration items are automatically implemented, including VPC, Transit Gateway (TGW), SNAT and connectivity profile. I will continue to use this default VPC when creating the Object Store, as we will see later.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33093 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?resize=769%2C511&#038;ssl=1" alt="" width="769" height="511" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?resize=1024%2C680&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?resize=300%2C199&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?resize=768%2C510&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?resize=769%2C511&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/3.-oss-org-setup-region-.png?w=1315&amp;ssl=1 1315w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">The final step in the Organization setup is to create a first user. In my case I am creating a first user who has the privileges of an Organisation Administrator. We will use this user later when we log onto the organisation we created.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33095" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?resize=768%2C570&#038;ssl=1" alt="" width="768" height="570" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?w=876&amp;ssl=1 876w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?resize=300%2C223&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?resize=768%2C570&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/4.-org-setup-first-user.png?resize=769%2C571&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">When the Organisation is created, we can launch the Organisation portal directly from the Provider / System organization, automatically connecting to it as the Provider Admin. This approach does have some restrictions. In particular, whilst it should be possible for a Provider Admin to create Object Stores on behalf of organisation users, the Provider Admin should not be able to have access to buckets or bucket contents on the object store.</p>
<h2>Create Object Store</h2>
<p style="text-align: justify;">As the Provider Admin in the tenant Organisation, I can select the Build &amp; Deploy tab, and observe that there is now an Object Storage menu item on the left hand side. Click this should take me to the option of creating an object store, as shown below.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33096 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?resize=769%2C282&#038;ssl=1" alt="" width="769" height="282" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?resize=1024%2C376&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?resize=300%2C110&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?resize=768%2C282&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?resize=769%2C282&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/7.-obj-store-create-1.png?w=1273&amp;ssl=1 1273w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">Let&#8217;s look at the information that must be provided when building an object store. Obviously, give the object store a name and select which region it is to be placed. The region quote from this region, which includes the vSAN Object Storage class will be used to place the volumes for the object store. You must select a VPC. In this case, it is the default VPC for the organisation but it could be a completely different VPC if you wish. The VPC must exist before you start the object store create process; it is not possible to create a new VPC in this workflow like we have with namespace creation. Set the size of the object store (100Gb minimum), and decide if you want to enable secure HTTPS access or not to the endpoints. If you do want secure access (recommended), you will need to provide a wildcard certificate (e.g., *.rainpole.io) and a private key to enable secure access on the object store endpoints (IAM and storage). Lastly, select a performance class (resources) for the object store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33098" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?resize=768%2C884&#038;ssl=1" alt="" width="768" height="884" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?w=830&amp;ssl=1 830w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?resize=261%2C300&amp;ssl=1 261w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?resize=768%2C884&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/8.-obje-store-create-2.png?resize=769%2C885&amp;ssl=1 769w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p style="text-align: justify;">This will initiate the creation of a new Supervisor namespace for the object store, based on the name of the object store. Initially you should observe the &#8216;telegraf&#8217; and the &#8216;config manager&#8217; vSphere pods starting up.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33100" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=769%2C177&#038;ssl=1" alt="" width="769" height="177" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=1024%2C236&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=300%2C69&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=768%2C177&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=1536%2C354&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?resize=769%2C177&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/9.-obj-store-create-backend.png?w=1869&amp;ssl=1 1869w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">After a few moments, this should expand to 5 vSphere pods, and all should enter a running state if no issues are encountered.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33101" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=769%2C189&#038;ssl=1" alt="" width="769" height="189" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=1024%2C252&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=300%2C74&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=768%2C189&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=1536%2C378&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?resize=769%2C189&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/10.-obj-store-backend-running.png?w=1873&amp;ssl=1 1873w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">A number of network services and endpoints for the object store should also be created in the namespace:</p>
<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33102" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=769%2C164&#038;ssl=1" alt="" width="769" height="164" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=1024%2C219&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=300%2C64&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=768%2C164&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=1536%2C328&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?resize=769%2C164&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/11.-obj-store-backend-network.png?w=1876&amp;ssl=1 1876w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a>Checking back in VCFA, we should see the object store come online and healthy. Note that the IAM (Identity and Access Management) and storage endpoints should correlate to the LoadBalancer IP address of the Envoy service in the namespace network services view above. You should ensure that the object storage FQDN resolves to that IP address in your DNS.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33103" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=769%2C213&#038;ssl=1" alt="" width="769" height="213" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=1024%2C283&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=300%2C83&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=768%2C212&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=1536%2C425&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?resize=769%2C213&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/12.-obj-store-online.png?w=1645&amp;ssl=1 1645w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">As you are still connected to the organization as the Provider Admin, you can try to connect to the Object Store. You may need to accept the certificates depending on how they were created, and if your browser trusts the Certificate Authority used to build them.</p>
<p style="text-align: justify;"><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33104 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?resize=769%2C491&#038;ssl=1" alt="" width="769" height="491" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?resize=1024%2C654&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?resize=300%2C192&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?resize=768%2C490&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?resize=769%2C491&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/13.-connect-to-obj-store.png?w=1234&amp;ssl=1 1234w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a> But even after doing so, you should observe that your Provider Admin is not allowed to see any details regarding how the organization is using the object store. The Provider Admin cannot see any buckets or bucket contents, nor can they see Access Control info or any service accounts. This is by design. Let&#8217;s now try this step as an Org Admin.</p>
<h2>Access Object Store as Org Admin</h2>
<p style="text-align: justify;">Log out as the Provider Admin, change organizations to the tenant organisation where the object store is created and login as the Org Admin using the first user credentials created when the Org was created.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/15.-login-to-tenant-as-admin.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33106 size-full" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/15.-login-to-tenant-as-admin.png?resize=400%2C445&#038;ssl=1" alt="" width="400" height="445" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/15.-login-to-tenant-as-admin.png?w=400&amp;ssl=1 400w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/15.-login-to-tenant-as-admin.png?resize=270%2C300&amp;ssl=1 270w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a></p>
<p style="text-align: justify;">Now when we connect, we can see the initial credentials pop up after accepting the certificates. This looks better than previous when we tried to use the Provider Admin to access the object store.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33107 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=769%2C379&#038;ssl=1" alt="" width="769" height="379" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=1024%2C505&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=300%2C148&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=768%2C379&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=1536%2C758&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?resize=769%2C379&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/16.-connect-successful-initial-creds.png?w=1644&amp;ssl=1 1644w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<p style="text-align: justify;">And finally we are in a position to create buckets and manage access control and additional security credentials to said buckets. In a future post, I will go into more detail regarding access controls, and what access different roles within a project have when it comes to object storage.</p>
<p><a href="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?ssl=1" target="_blank" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" class="aligncenter wp-image-33108 size-large" src="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=769%2C357&#038;ssl=1" alt="" width="769" height="357" srcset="https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=1024%2C475&amp;ssl=1 1024w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=300%2C139&amp;ssl=1 300w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=768%2C356&amp;ssl=1 768w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=1536%2C712&amp;ssl=1 1536w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?resize=769%2C357&amp;ssl=1 769w, https://i0.wp.com/cormachogan.com/wp-content/uploads/2026/09/17.-good-to-go.png?w=1643&amp;ssl=1 1643w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></p>
<h2>Summary</h2>
<p style="text-align: justify;">That completes the post. I hope it has given you an idea of how we have architected Native Object Storage, using vSAN, into VCF version 9.1.1. I will be following up with some additional post to go deeper into some of the aspects here, notably how to control who has access to the buckets from within an organisation. We will also look into some CLI (since Native Object Storage supports the standard S3 API, we can do lots of cool things via tools such as the aws cli, for example). Thanks for reading this far. I am sure you will agree that this is a very interesting feature in VCF 9.1.1.</p>
<p>The post <a href="https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/">A first look at Native Object Storage in VCF 9.1.1</a> appeared first on <a href="https://cormachogan.com">CormacHogan.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cormachogan.com/2026/09/08/a-first-look-at-native-object-storage-in-vcf-9-1-1/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">33083</post-id>	</item>
	</channel>
</rss>
