AWS Security ChangesHomeSearch

AWS deadline-cloud documentation change

Service: deadline-cloud · 2026-01-22 · Documentation low

File: deadline-cloud/latest/developerguide/smf-byol.md

Summary

Updated BYOL documentation to include usage-based licensing (UBL) fallback when BYOL licenses are exhausted. Expanded default ports list, changed example license port from 2700 to 2701, replaced PowerShell scripts with bash, and added Python code to configure multiple DCC licenses with UBL fallback logic. Updated CloudFormation template parameters and added XML configuration for V-Ray licensing.

Security assessment

The changes focus on license management improvements and fallback mechanisms. No security vulnerabilities or weaknesses are addressed. Modifications include port list expansions, script language changes, and license configuration logic - all operational improvements without security implications.

Diff

diff --git a/deadline-cloud/latest/developerguide/smf-byol.md b/deadline-cloud/latest/developerguide/smf-byol.md
index 34dd302f5..7919d2cb8 100644
--- a//deadline-cloud/latest/developerguide/smf-byol.md
+++ b//deadline-cloud/latest/developerguide/smf-byol.md
@@ -20 +20 @@ How you connect to a software license server depends on the configuration of you
-With the instructions below, you use Amazon EC2 Systems Manager (SSM) to forward ports from a worker instance to your license server or proxy instance. 
+With the instructions below, you use Amazon EC2 Systems Manager (SSM) to forward ports from a worker instance to your license server or proxy instance. In the example below if your license server is unable to provide a license, Deadline Cloud's usage based licensing will be used. Remove the sections that don't apply to your pipeline or products for which you don't want to use usage based licensing after exhausting your licenses.
@@ -127,3 +127,3 @@ Windows
-          Comma-separated list of ports to be forwarded to the license server/proxy instance.
-          Example: "2700,2701,2702"
-        default: ""
+        Comma-separated list of ports to be forwarded to the license server/proxy
+        instance. Example: "2701,2702,7075,2703,6101,1715,1716,1717,7054,7055,30304"
+       default: "2701,2702,7075,2703,6101,1715,1716,1717,7054,7055,30304"
@@ -133 +133 @@ Windows
-        example_LICENSE: 2700@localhost
+      example_LICENSE: 2701@localhost
@@ -137 +137 @@ Windows
-            command: powershell
+        command: bash
@@ -140 +140 @@ Windows
-            command: powershell
+        command: bash
@@ -144 +143,0 @@ Windows
-            filename: enter.ps1
@@ -148,4 +147,2 @@ Windows
-              $ZIP_NAME="SessionManagerPlugin.zip"
-              Invoke-WebRequest -Uri "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/$ZIP_NAME" -OutFile $ZIP_NAME
-              Expand-Archive -Path $ZIP_NAME
-              Expand-Archive -Path .\SessionManagerPlugin\package.zip
+          curl https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm -Ls | rpm2cpio - | cpio -iv --to-stdout ./usr/local/sessionmanagerplugin/bin/session-manager-plugin > {{Session.WorkingDirectory}}/session-manager-plugin
+          chmod +x {{Session.WorkingDirectory}}/session-manager-plugin
@@ -153 +150 @@ Windows
-              python {{Env.File.StartSession}} {{Session.WorkingDirectory}}\package\bin\session-manager-plugin.exe
+          python {{Env.File.StartSession}} {{Session.WorkingDirectory}}/session-manager-plugin
@@ -155 +151,0 @@ Windows
-            filename: exit.ps1
@@ -159,5 +155,2 @@ Windows
-              Write-Output "Killing SSM Manager Plugin PIDs: $env:BYOL_SSM_PIDS"
-              "$env:BYOL_SSM_PIDS".Split(",") | ForEach {
-                Write-Output "Killing $_"
-                Stop-Process -Id $_ -Force
-              }
+          echo Killing SSM Manager Plugin PIDs: $BYOL_SSM_PIDS
+          for pid in ${BYOL_SSM_PIDS//,/ }; do kill $pid; done
@@ -170,0 +164,2 @@ Windows
+          import os
+          import tempfile
@@ -201,0 +197,63 @@ Windows
+          # Enabling UBL after the BYOL has run out requires prepending the BYOL configuration to the existing license setup
+          # Remove the sections that do not apply to your pipeline, or you do not want to use UBL after exhausting the BYOL licenses.
+          # The port numbers used may not match what your license server is serving.
+    
+          # Arnold
+          os.environ["ADSKFLEX_LICENSE_FILE"] = f"2701@localhost;{os.environ.get('ADSKFLEX_LICENSE_FILE', '')}"
+          print(f"openjd_env: ADSKFLEX_LICENSE_FILE={os.environ['ADSKFLEX_LICENSE_FILE']}")
+    
+          # Cinema4D
+          os.environ["g_licenseServerRLM"] = f"localhost:7057;{os.environ.get('g_licenseServerRLM', '')}"
+          print(f"openjd_env: g_licenseServerRLM={os.environ['g_licenseServerRLM']}")
+    
+          # Nuke
+          os.environ["foundry_LICENSE"] = f"6101@localhost;{os.environ.get('foundry_LICENSE', '')}"
+          print(f"openjd_env: foundry_LICENSE={os.environ['foundry_LICENSE']}")
+    
+          # SideFX
+          os.environ["SESI_LMHOST"] = f"localhost:1715;{os.environ.get('SESI_LMHOST', '')}"
+          print(f"openjd_env: SESI_LMHOST={os.environ['SESI_LMHOST']}")
+    
+          # Redshift and Red Giant
+          os.environ["redshift_LICENSE"] = f"7054@localhost;7055@localhost;{os.environ.get('redshift_LICENSE', '')}"
+          print(f"openjd_env: redshift_LICENSE={os.environ['redshift_LICENSE']}")
+    
+          # V-Ray doesn't support multiple license servers in a single environment variable
+          # See https://documentation.chaos.com/space/LIC5/125050770/Sharing+a+License+Configuration+in+a+Network
+          vray_license = os.environ.get('VRAY_AUTH_CLIENT_SETTINGS', '')
+          xml_content = """<VRLClient>
+            <LicServer>
+              <Host>localhost</Host>
+              <Port>30304</Port>"""
+    
+          if vray_license and vray_license.startswith('licset://'):
+              server_parts = vray_license.removeprefix('licset://').split(':')
+              if len(server_parts) >= 2:
+                  xml_content += f"""
+              <Host1>{server_parts[0]}</Host1>
+              <Port1>{server_parts[1]}</Port1>"""
+    
+          xml_content += """
+              <User></User>
+              <Pass></Pass>
+            </LicServer>
+          </VRLClient>"""
+    
+          temp_dir = tempfile.gettempdir()
+          xml_path = os.path.join(temp_dir, 'vrlclient.xml')
+          
+          with open(xml_path, 'w') as f:
+              f.write(xml_content)
+    
+          os.environ["VRAY_AUTH_CLIENT_FILE_PATH"] = temp_dir
+          print(f"openjd_env: VRAY_AUTH_CLIENT_FILE_PATH={os.environ['VRAY_AUTH_CLIENT_FILE_PATH']}")
+    
+          # Clear the existing VRAY_AUTH_CLIENT_SETTINGS so only the vrlclient.xml file is used.
+          os.environ["VRAY_AUTH_CLIENT_SETTINGS"] = ''
+          print(f"openjd_env: VRAY_AUTH_CLIENT_SETTINGS={os.environ['VRAY_AUTH_CLIENT_SETTINGS']}")
+    
+          # Print out the created xml file's contents
+          print(f"V-Ray configuration file: {xml_path}")
+          with open(xml_path, 'r') as f:
+              print(f"{f.read()}")
+                    
@@ -221,3 +279,3 @@ Linux
-          Comma-separated list of ports to be forwarded to the license server/proxy instance.
-          Example: "2700,2701,2702"
-        default: ""
+        Comma-separated list of ports to be forwarded to the license server/proxy
+        instance. Example: "2701,2702,7075,2703,6101,1715,1716,1717,7054,7055,30304"
+       default: "2701,2702,7075,2703,6101,1715,1716,1717,7054,7055,30304"
@@ -227 +285 @@ Linux
-        example_LICENSE: 2700@localhost
+      example_LICENSE: 2701@localhost
@@ -257,0 +316,2 @@ Linux
+          import os
+          import tempfile
@@ -288,0 +349,59 @@ Linux
+          # Enabling UBL after the BYOL has run out requires prepending the BYOL configuration to the existing license setup
+          # Remove the sections that do not apply to your pipeline, or you do not want to use UBL after exhausting the BYOL licenses.
+          # The port numbers used may not match what your license server is serving.
+    
+          # Arnold
+          os.environ["ADSKFLEX_LICENSE_FILE"] = f"2701@localhost:{os.environ.get('ADSKFLEX_LICENSE_FILE', '')}"
+          print(f"openjd_env: ADSKFLEX_LICENSE_FILE={os.environ['ADSKFLEX_LICENSE_FILE']}")
+    
+          # Nuke
+          os.environ["foundry_LICENSE"] = f"6101@localhost:{os.environ.get('foundry_LICENSE', '')}"
+          print(f"openjd_env: foundry_LICENSE={os.environ['foundry_LICENSE']}")
+    
+          # SideFX
+          os.environ["SESI_LMHOST"] = f"localhost:1715;{os.environ.get('SESI_LMHOST', '')}"
+          print(f"openjd_env: SESI_LMHOST={os.environ['SESI_LMHOST']}")
+    
+          # Redshift and Red Giant
+          os.environ["redshift_LICENSE"] = f"7054@localhost:7055@localhost:{os.environ.get('redshift_LICENSE', '')}"
+          print(f"openjd_env: redshift_LICENSE={os.environ['redshift_LICENSE']}")
+    
+          # V-Ray doesn't support multiple license servers in a single environment variable
+          # See https://documentation.chaos.com/space/LIC5/125050770/Sharing+a+License+Configuration+in+a+Network
+          vray_license = os.environ.get('VRAY_AUTH_CLIENT_SETTINGS', '')
+          xml_content = """<VRLClient>
+            <LicServer>
+              <Host>localhost</Host>
+              <Port>30304</Port>"""
+    
+          if vray_license and vray_license.startswith('licset://'):
+              server_parts = vray_license.removeprefix('licset://').split(':')
+              if len(server_parts) >= 2:
+                  xml_content += f"""
+              <Host1>{server_parts[0]}</Host1>
+              <Port1>{server_parts[1]}</Port1>"""
+    
+          xml_content += """
+              <User></User>
+              <Pass></Pass>
+            </LicServer>
+          </VRLClient>"""
+    
+          temp_dir = tempfile.gettempdir()
+          xml_path = os.path.join(temp_dir, 'vrlclient.xml')
+          
+          with open(xml_path, 'w') as f:
+              f.write(xml_content)
+    
+          os.environ["VRAY_AUTH_CLIENT_FILE_PATH"] = temp_dir
+          print(f"openjd_env: VRAY_AUTH_CLIENT_FILE_PATH={os.environ['VRAY_AUTH_CLIENT_FILE_PATH']}")
+    
+          # Clear the existing VRAY_AUTH_CLIENT_SETTINGS so only the vrlclient.xml file is used.
+          os.environ["VRAY_AUTH_CLIENT_SETTINGS"] = ''
+          print(f"openjd_env: VRAY_AUTH_CLIENT_SETTINGS={os.environ['VRAY_AUTH_CLIENT_SETTINGS']}")
+    
+          # Print out the created xml file's contents
+          print(f"V-Ray configuration file: {xml_path}")
+          with open(xml_path, 'r') as f:
+              print(f"{f.read()}")
+                    
@@ -300 +419,3 @@ Linux
-     * Add any required licensing environment variables to the variables section. These variables should direct the DCCs to localhost on the license server port. For example, if your Foundry license server is listening on port 6101, you would add the variable as `foundry_LICENSE: 6101@localhost`.
+     * If you want to use usage based licensing (UBL) after Bring your own license (BYOL) is exhausted be sure the port is correct for your license server. If you do not want to use UBL after running out of BYOL, add any required licensing environment variables to the variables section.
+
+These variables should direct the DCCs to localhost on the license server port. For example, if your Foundry license server is listening on port 6101, you would add the variable as `foundry_LICENSE: 6101@localhost`.
@@ -365 +486 @@ You can use a CloudFormation template to configure an entire farm to use your ow
-    Description: "Create Deadline Cloud resources for BYOL"
+    Description: "Create &ADC; resources for BYOL"
@@ -570,2 +691,2 @@ You can use a CloudFormation template to configure an entire farm to use your ow
-                This is a space-separated list of Conda channels from which to install packages. Deadline Cloud SMF packages are
-                installed from the "deadline-cloud" channel that is configured by Deadline Cloud.
+                This is a space-separated list of Conda channels from which to install packages. &ADC; SMF packages are
+                installed from the "deadline-cloud" channel that is configured by &ADC;.
@@ -603 +724 @@ You can use a CloudFormation template to configure an entire farm to use your ow
-                default: "${LicenseInstanceId}"