Solución de problemas de BMM mediante az networkcloud baremetalmachine run-read-command
Puede que haya situaciones en las que un usuario necesite investigar y resolver problemas con una máquina sin sistema operativo (BMM) local. Operator Nexus proporciona az networkcloud baremetalmachine run-read-command
para que los usuarios puedan ejecutar una lista mantenida de comandos de solo lectura para obtener información de una BMM.
El comando genera un archivo de salida que contiene los resultados de la ejecución del comando run-read. De forma predeterminada, los datos se envían a la cuenta de almacenamiento del Administrador de clústeres. También hay un método de vista previa en el que los usuarios pueden configurar el recurso de clúster con una cuenta de almacenamiento e identidad que tenga acceso a la cuenta de almacenamiento para recibir la salida.
Requisitos previos
- Instale la versión más reciente de las extensiones de la CLI adecuadas
- Asegúrese de que la BMM de destino tenga
poweredState
establecido enOn
y quereadyState
esté establecido enTrue
- Obtenga el nombre del grupo de recursos administrados (cluster_MRG) que ha creado para el recurso
Cluster
Comprobar acceso a la cuenta de almacenamiento del Administrador de clústeres
Nota:
El método de salida de la cuenta de almacenamiento del administrador de clúster quedará en desuso en el futuro una vez completada la incorporación del clúster a servicios de confianza y la opción de almacenamiento administrado por el usuario es totalmente compatible.
Si usa el método de almacenamiento del Administrador de clústeres, compruebe que tiene acceso a la cuenta de almacenamiento del Administrador de clústeres:
- En Azure Portal, vaya a la cuenta de almacenamiento del Administrador de clústeres.
- En los detalles de la cuenta de almacenamiento, seleccione Explorador de almacenamiento en el menú de navegación del lado izquierdo.
- En los detalles del explorador de almacenamiento, seleccione Contenedores de blobs.
- Si se encuentra el mensaje
403 This request is not authorized to perform this operation.
mientras accede a la cuenta de almacenamiento, la configuración del firewall de la cuenta de almacenamiento debe actualizarse para incluir la dirección IP pública. - Solicite acceso mediante la creación de una incidencia de soporte técnico a través del portal en el recurso Administrador de clústeres. Proporcione la dirección IP pública que requiere acceso.
VERSIÓN PRELIMINAR: envío de la salida del comando a una cuenta de almacenamiento especificada por el usuario
Importante
Tenga en cuenta que este método para especificar una cuenta de almacenamiento de usuario para la salida del comando está en versión preliminar. Este método solo debe usarse con cuentas de almacenamiento de usuario que no tengan el firewall habilitado. Si el entorno requiere que el firewall de la cuenta de almacenamiento esté habilitado, use el método de salida del Administrador de clústeres existente.
Crear y configurar recursos de almacenamiento
- Cree una cuenta de almacenamiento o identifique una cuenta de almacenamiento existente que quiera usar. Consulte Crear una cuenta de almacenamiento de Azure.
- Cree un contenedor de Blob Storage en la cuenta de almacenamiento. Consulte Crear un contenedor.
- Asigne el rol "Colaborador de datos de blobs de almacenamiento" a los usuarios e identidades administradas que necesitan acceso a la salida run-data-extract.
- Consulte Asignación de un rol de Azure para acceder a datos de blobs. El rol también debe asignarse a una identidad administrada asignada por el usuario o a la propia identidad administrada asignada por el sistema del clúster.
- Para más información sobre las identidades administradas, consulte Identidades administradas para recursos de Azure.
- Si usa la identidad asignada por el sistema del clúster, la identidad asignada por el sistema debe agregarse al clúster antes de que se pueda conceder acceso.
- Al asignar un rol a la identidad asignada por el sistema del clúster, asegúrese de seleccionar el recurso con el tipo "Cluster (Operator Nexus)".
Configurar el clúster para usar una identidad administrada asignada por el usuario para el acceso al almacenamiento
Use este comando para crear un clúster con una cuenta de almacenamiento administrada por el usuario y una identidad asignada por el usuario. Tenga en cuenta que este ejemplo es un comando abreviado que simplemente resalta los campos pertinentes para agregar el almacenamiento administrado por el usuario. No es el comando de creación de clúster completo.
az networkcloud cluster create --name "<cluster-name>" \
--resource-group "<cluster-resource-group>" \
...
--mi-user-assigned "<user-assigned-identity-resource-id>" \
--command-output-settings identity-type="UserAssignedIdentity" \
identity-resource-id="<user-assigned-identity-resource-id>" \
container-url="<container-url>" \
...
--subscription "<subscription>"
Use este comando para configurar un clúster existente para una cuenta de almacenamiento proporcionada por el usuario y una identidad asignada por el usuario. El comando update también se puede usar para cambiar la ubicación y la identidad de la cuenta de almacenamiento si es necesario.
az networkcloud cluster update --name "<cluster-name>" \
--resource-group "<cluster-resource-group>" \
--mi-user-assigned "<user-assigned-identity-resource-id>" \
--command-output-settings identity-type="UserAssignedIdentity" \
identity-resource-id="<user-assigned-identity-resource-id>" \
container-url="<container-url>" \
--subscription "<subscription>"
Configuración del clúster para usar una identidad administrada asignada por el sistema para el acceso al almacenamiento
Use este comando para crear un clúster con una cuenta de almacenamiento administrada por el usuario y una identidad asignada por el sistema. Tenga en cuenta que este ejemplo es un comando abreviado que simplemente resalta los campos pertinentes para agregar el almacenamiento administrado por el usuario. No es el comando de creación de clúster completo.
az networkcloud cluster create --name "<cluster-name>" \
--resource-group "<cluster-resource-group>" \
...
--mi-system-assigned true \
--command-output-settings identity-type="SystemAssignedIdentity" \
container-url="<container-url>" \
...
--subscription "<subscription>"
Use este comando para configurar un clúster existente para una cuenta de almacenamiento proporcionada por el usuario y para usar su propia identidad asignada por el sistema. El comando update también se puede usar para cambiar la ubicación de la cuenta de almacenamiento.
az networkcloud cluster update --name "<cluster-name>" \
--resource-group "<cluster-resource-group>" \
--mi-system-assigned true \
--command-output-settings identity-type="SystemAssignedIdentity" \
container-url="<container-url>" \
--subscription "<subscription>"
Para cambiar el clúster de una identidad asignada por el usuario a una identidad asignada por el sistema, la CommandOutputSettings primero debe borrarse mediante el comando de la sección siguiente y, a continuación, establecer con este comando.
Borrar la CommandOutputSettings del clúster
La CommandOutputSettings se puede borrar y volver a dirigir la salida run-data-extract al almacenamiento del administrador del clúster. Sin embargo, no se recomienda, ya que es menos seguro y la opción se quitará en una versión futura.
Sin embargo, la CommandOutputSettings debe borrarse si se cambia de una identidad asignada por el usuario a una identidad asignada por el sistema.
Use este comando para borrar CommandOutputSettings:
az rest --method patch \
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<cluster-resource-group>/providers/Microsoft.NetworkCloud/clusters/<cluster-name>?api-version=2024-08-01-preview" \
--body '{"properties": {"commandOutputSettings":null}}'
Ver el id. de entidad de seguridad de la identidad administrada
Para encontrar el id. de recurso de identidad, seleccione "Vista JSON" en el recurso de identidad; el id. está en la parte superior del panel que aparece. La dirección URL del contenedor se puede encontrar en la pestaña Configuración: Propiedades de > del recurso de contenedor.
La CLI también se puede usar para ver la identidad y los datos del identificador de entidad de seguridad asociados dentro del clúster.
Ejemplo:
az networkcloud cluster show --ids /subscriptions/<Subscription ID>/resourceGroups/<Cluster Resource Group Name>/providers/Microsoft.NetworkCloud/clusters/<Cluster Name>
Ejemplo de identidad asignada por el sistema:
"identity": {
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned"
},
Ejemplo de identidad asignada por el usuario:
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscriptionID>/resourcegroups/<resourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<userAssignedIdentityName>": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "bbbbbbbb-cccc-dddd-2222-333333333333"
}
}
},
Ejecución de un comando run-read
El comando run-read le permite ejecutar un comando en la BMM que no cambia nada. Algunos comandos tienen más de una palabra o necesitan un argumento para funcionar. Estos comandos se realizan de esta manera para separarlos de los que pueden cambiar cosas. Por ejemplo, run-read-command puede usar kubectl get
pero no kubectl apply
. Al usar estos comandos, debe colocar todas las palabras en el campo "comando". Por ejemplo, {"command":"kubectl get","arguments":["nodes"]}
es correcto; {"command":"kubectl","arguments":["get","nodes"]}
es incorrecto.
Tenga en cuenta también que algunos comandos comienzan por nc-toolbox nc-toolbox-runread
y deben escribirse como se muestra.
nc-toolbox-runread
es una imagen de contenedor especial que incluye más herramientas que no están instaladas en el host del equipo sin sistema operativo, como ipmitool
y racadm
.
Algunos de los comandos run-read requieren que se proporcionen argumentos específicos para aplicar funcionalidades de solo lectura de los comandos.
Un ejemplo de comandos run-read que requieren argumentos específicos es el comando Mellanox permitido mstconfig
, que requiere que se proporcione el argumento query
para aplicar solo lectura.
Advertencia
Microsoft no proporciona ni admite ninguna llamada a la API de Operator Nexus que espere que se proporcione el nombre de usuario o la contraseña de texto no cifrado. Tenga en cuenta que los valores enviados se registrarán y se considerarán secretos expuestos, que se deben rotar y revocar. El método documentado de Microsoft para usar secretos de forma segura es almacenarlos en una instancia de Azure Key Vault. Si tiene alguna pregunta o duda en concreto, envíe una solicitud a través de Azure Portal.
En esta lista se muestran los comandos que puede usar. Los comandos de *italics*
no pueden tener arguments
; el resto puede.
arp
brctl show
dmidecode
fdisk -l
host
hostname
ifconfig -a
ifconfig -s
ip address show
ip link show
ip maddress show
ip route show
journalctl
kubectl api-resources
kubectl api-versions
kubectl describe
kubectl get
kubectl logs
mount
ping
ss
tcpdump
traceroute
uname
ulimit -a
uptime
nc-toolbox nc-toolbox-runread ipmitool channel authcap
nc-toolbox nc-toolbox-runread ipmitool channel info
nc-toolbox nc-toolbox-runread ipmitool chassis status
nc-toolbox nc-toolbox-runread ipmitool chassis power status
nc-toolbox nc-toolbox-runread ipmitool chassis restart cause
nc-toolbox nc-toolbox-runread ipmitool chassis poh
nc-toolbox nc-toolbox-runread ipmitool dcmi power get_limit
nc-toolbox nc-toolbox-runread ipmitool dcmi sensors
nc-toolbox nc-toolbox-runread ipmitool dcmi asset_tag
nc-toolbox nc-toolbox-runread ipmitool dcmi get_mc_id_string
nc-toolbox nc-toolbox-runread ipmitool dcmi thermalpolicy get
nc-toolbox nc-toolbox-runread ipmitool dcmi get_temp_reading
nc-toolbox nc-toolbox-runread ipmitool dcmi get_conf_param
nc-toolbox nc-toolbox-runread ipmitool delloem lcd info
nc-toolbox nc-toolbox-runread ipmitool delloem lcd status
nc-toolbox nc-toolbox-runread ipmitool delloem mac list
nc-toolbox nc-toolbox-runread ipmitool delloem mac get
nc-toolbox nc-toolbox-runread ipmitool delloem lan get
nc-toolbox nc-toolbox-runread ipmitool delloem powermonitor powerconsumption
nc-toolbox nc-toolbox-runread ipmitool delloem powermonitor powerconsumptionhistory
nc-toolbox nc-toolbox-runread ipmitool delloem powermonitor getpowerbudget
nc-toolbox nc-toolbox-runread ipmitool delloem vflash info card
nc-toolbox nc-toolbox-runread ipmitool echo
nc-toolbox nc-toolbox-runread ipmitool ekanalyzer print
nc-toolbox nc-toolbox-runread ipmitool ekanalyzer summary
nc-toolbox nc-toolbox-runread ipmitool fru print
nc-toolbox nc-toolbox-runread ipmitool fwum info
nc-toolbox nc-toolbox-runread ipmitool fwum status
nc-toolbox nc-toolbox-runread ipmitool fwum tracelog
nc-toolbox nc-toolbox-runread ipmitool gendev list
nc-toolbox nc-toolbox-runread ipmitool hpm rollbackstatus
nc-toolbox nc-toolbox-runread ipmitool hpm selftestresult
nc-toolbox nc-toolbox-runread ipmitool ime help
nc-toolbox nc-toolbox-runread ipmitool ime info
nc-toolbox nc-toolbox-runread ipmitool isol info
nc-toolbox nc-toolbox-runread ipmitool lan print
nc-toolbox nc-toolbox-runread ipmitool lan alert print
nc-toolbox nc-toolbox-runread ipmitool lan stats get
nc-toolbox nc-toolbox-runread ipmitool mc bootparam get
nc-toolbox nc-toolbox-runread ipmitool mc chassis poh
nc-toolbox nc-toolbox-runread ipmitool mc chassis policy list
nc-toolbox nc-toolbox-runread ipmitool mc chassis power status
nc-toolbox nc-toolbox-runread ipmitool mc chassis status
nc-toolbox nc-toolbox-runread ipmitool mc getenables
nc-toolbox nc-toolbox-runread ipmitool mc getsysinfo
nc-toolbox nc-toolbox-runread ipmitool mc guid
nc-toolbox nc-toolbox-runread ipmitool mc info
nc-toolbox nc-toolbox-runread ipmitool mc restart cause
nc-toolbox nc-toolbox-runread ipmitool mc watchdog get
nc-toolbox nc-toolbox-runread ipmitool bmc bootparam get
nc-toolbox nc-toolbox-runread ipmitool bmc chassis poh
nc-toolbox nc-toolbox-runread ipmitool bmc chassis policy list
nc-toolbox nc-toolbox-runread ipmitool bmc chassis power status
nc-toolbox nc-toolbox-runread ipmitool bmc chassis status
nc-toolbox nc-toolbox-runread ipmitool bmc getenables
nc-toolbox nc-toolbox-runread ipmitool bmc getsysinfo
nc-toolbox nc-toolbox-runread ipmitool bmc guid
nc-toolbox nc-toolbox-runread ipmitool bmc info
nc-toolbox nc-toolbox-runread ipmitool bmc restart cause
nc-toolbox nc-toolbox-runread ipmitool bmc watchdog get
nc-toolbox nc-toolbox-runread ipmitool nm alert get
nc-toolbox nc-toolbox-runread ipmitool nm capability
nc-toolbox nc-toolbox-runread ipmitool nm discover
nc-toolbox nc-toolbox-runread ipmitool nm policy get policy_id
nc-toolbox nc-toolbox-runread ipmitool nm policy limiting
nc-toolbox nc-toolbox-runread ipmitool nm statistics
nc-toolbox nc-toolbox-runread ipmitool nm suspend get
nc-toolbox nc-toolbox-runread ipmitool nm threshold get
nc-toolbox nc-toolbox-runread ipmitool pef
nc-toolbox nc-toolbox-runread ipmitool picmg addrinfo
nc-toolbox nc-toolbox-runread ipmitool picmg policy get
nc-toolbox nc-toolbox-runread ipmitool power status
nc-toolbox nc-toolbox-runread ipmitool sdr elist
nc-toolbox nc-toolbox-runread ipmitool sdr get
nc-toolbox nc-toolbox-runread ipmitool sdr info
nc-toolbox nc-toolbox-runread ipmitool sdr list
nc-toolbox nc-toolbox-runread ipmitool sdr type
nc-toolbox nc-toolbox-runread ipmitool sel elist
nc-toolbox nc-toolbox-runread ipmitool sel get
nc-toolbox nc-toolbox-runread ipmitool sel info
nc-toolbox nc-toolbox-runread ipmitool sel list
nc-toolbox nc-toolbox-runread ipmitool sel time get
nc-toolbox nc-toolbox-runread ipmitool sensor get
nc-toolbox nc-toolbox-runread ipmitool sensor list
nc-toolbox nc-toolbox-runread ipmitool session info
nc-toolbox nc-toolbox-runread ipmitool sol info
nc-toolbox nc-toolbox-runread ipmitool sol payload status
nc-toolbox nc-toolbox-runread ipmitool user list
nc-toolbox nc-toolbox-runread ipmitool user summary
nc-toolbox nc-toolbox-runread racadm arp
nc-toolbox nc-toolbox-runread racadm coredump
nc-toolbox nc-toolbox-runread racadm diagnostics
nc-toolbox nc-toolbox-runread racadm eventfilters get
nc-toolbox nc-toolbox-runread racadm fcstatistics
nc-toolbox nc-toolbox-runread racadm get
nc-toolbox nc-toolbox-runread racadm getconfig
nc-toolbox nc-toolbox-runread racadm gethostnetworkinterfaces
nc-toolbox nc-toolbox-runread racadm getled
nc-toolbox nc-toolbox-runread racadm getniccfg
nc-toolbox nc-toolbox-runread racadm getraclog
nc-toolbox nc-toolbox-runread racadm getractime
nc-toolbox nc-toolbox-runread racadm getsel
nc-toolbox nc-toolbox-runread racadm getsensorinfo
nc-toolbox nc-toolbox-runread racadm getssninfo
nc-toolbox nc-toolbox-runread racadm getsvctag
nc-toolbox nc-toolbox-runread racadm getsysinfo
nc-toolbox nc-toolbox-runread racadm gettracelog
nc-toolbox nc-toolbox-runread racadm getversion
nc-toolbox nc-toolbox-runread racadm hwinventory
nc-toolbox nc-toolbox-runread racadm ifconfig
nc-toolbox nc-toolbox-runread racadm inlettemphistory get
nc-toolbox nc-toolbox-runread racadm jobqueue view
nc-toolbox nc-toolbox-runread racadm lclog view
nc-toolbox nc-toolbox-runread racadm lclog viewconfigresult
nc-toolbox nc-toolbox-runread racadm license view
nc-toolbox nc-toolbox-runread racadm netstat
nc-toolbox nc-toolbox-runread racadm nicstatistics
nc-toolbox nc-toolbox-runread racadm ping
nc-toolbox nc-toolbox-runread racadm ping6
nc-toolbox nc-toolbox-runread racadm racdump
nc-toolbox nc-toolbox-runread racadm sslcertview
nc-toolbox nc-toolbox-runread racadm swinventory
nc-toolbox nc-toolbox-runread racadm systemconfig getbackupscheduler
nc-toolbox nc-toolbox-runread racadm systemperfstatistics
(NO se permite el argumento PeakReset)nc-toolbox nc-toolbox-runread racadm techsupreport getupdatetime
nc-toolbox nc-toolbox-runread racadm traceroute
nc-toolbox nc-toolbox-runread racadm traceroute6
nc-toolbox nc-toolbox-runread racadm usercertview
nc-toolbox nc-toolbox-runread racadm vflashsd status
nc-toolbox nc-toolbox-runread racadm vflashpartition list
nc-toolbox nc-toolbox-runread racadm vflashpartition status -a
nc-toolbox nc-toolbox-runread mstregdump
nc-toolbox nc-toolbox-runread mstconfig
(requierequery
arg)nc-toolbox nc-toolbox-runread mstflint
(requierequery
arg)nc-toolbox nc-toolbox-runread mstlink
(requierequery
arg)nc-toolbox nc-toolbox-runread mstfwmanager
(requierequery
arg)nc-toolbox nc-toolbox-runread mlx_temp
La sintaxis del comando es la siguiente:
az networkcloud baremetalmachine run-read-command --name "<machine-name>"
--limit-time-seconds "<timeout>" \
--commands '[{"command":"<command1>"},{"command":"<command2>","arguments":["<arg1>","<arg2>"]}]' \
--resource-group "<cluster_MRG>" \
--subscription "<subscription>"
Se pueden proporcionar varios comandos en formato JSON a la opción --commands
.
En el caso de un comando con varios argumentos, proporciónelos como una lista al parámetro arguments
. Consulte la sintaxis abreviada de la CLI de Azure para obtener instrucciones sobre cómo crear la estructura --commands
.
Estos comandos pueden ser de larga duración, por lo que se recomienda establecer --limit-time-seconds
en al menos 600 segundos (10 minutos). La ejecución de varios comandos puede tardar más de 10 minutos.
Este comando se ejecuta sincrónicamente. Si desea omitir la espera hasta que se complete el comando, especifique las opciones --no-wait --debug
. Para obtener más información, consulte cómo realizar un seguimiento de las operaciones asincrónicas.
Cuando se proporciona un argumento --output-directory
opcional, el resultado de salida se descarga y se extrae en el directorio local.
Advertencia
El uso del argumento --output-directory
sobrescribirá los archivos del directorio local que tengan el mismo nombre que los nuevos archivos que se crean.
En este ejemplo se ejecuta un "kubectl get pods"
az networkcloud baremetalmachine run-read-command --name "<bareMetalMachineName>" \
--limit-time-seconds 60 \
--commands "[{command:'kubectl get',arguments:[pods,-n,nc-system]}]" \
--resource-group "<cluster_MRG>" \
--subscription "<subscription>"
En este ejemplo se ejecuta el comando hostname
y un comando ping
az networkcloud baremetalmachine run-read-command --name "<bareMetalMachineName>" \
--limit-time-seconds 60 \
--commands '[{"command":"hostname"},{"command":"ping","arguments":["198.51.102.1","-c","3"]}]' \
--resource-group "<cluster_MRG>" \
--subscription "<subscription>"
En este ejemplo se ejecuta el comando racadm getsysinfo -c
az networkcloud baremetalmachine run-read-command --name "<bareMetalMachineName>" \
--limit-time-seconds 60 \
--commands '[{"command":"nc-toolbox nc-toolbox-runread racadm getsysinfo","arguments":["-c"]}]' \
--resource-group "<cluster_MRG>" \
--subscription "<subscription>"
Visualización de la salida de az networkcloud baremetalmachine run-read-command
en la cuenta de almacenamiento del Administrador de clústeres
Esta guía le guía a través del acceso al archivo de salida que se crea en la cuenta de almacenamiento del Administrador de clústeres cuando se ejecuta az networkcloud baremetalmachine run-read-command
en un servidor. El nombre del archivo se identifica en la salida de estado az rest
.
Abra el grupo de recursos administrados del Administrador de clústeres para el clúster donde se hospeda el servidor y, a continuación, seleccione la Cuenta de almacenamiento.
En los detalles de la cuenta de almacenamiento, seleccione Explorador de almacenamiento en el menú de navegación del lado izquierdo.
En los detalles del explorador de almacenamiento, seleccione Contenedores de blobs.
Seleccione el contenedor de blobs baremetal-run-command-output.
La cuenta de almacenamiento podría bloquearse y, como consecuencia de ello, mostrarse el mensaje
403 This request is not authorized to perform this operation.
debido a restricciones de red o firewall. Consulte las secciones almacenamiento del administrador de clúster o almacenamiento administrado por el cliente para ver los procedimientos para comprobar el acceso.Seleccione el archivo de salida en el comando run-read. El nombre de archivo se puede identificar desde el comando
az rest --method get
. Además, la marca de tiempo Última modificación se alinea con el momento en que se ejecutó el comando.Puede administrar y descargar el archivo de salida desde el elemento emergente Información general.
VERSIÓN PRELIMINAR: compruebe el estado del comando y visualice la salida en una cuenta de almacenamiento especificada por el usuario
Se muestra una salida de ejemplo. Imprime los 4000 caracteres principales del resultado en la pantalla para mayor comodidad y proporciona un vínculo de corta duración al blob de almacenamiento que contiene el resultado de la ejecución del comando. Puede usar el vínculo para descargar el archivo de salida comprimido (tar.gz).
====Action Command Output====
+ hostname
rack1compute01
+ ping 198.51.102.1 -c 3
PING 198.51.102.1 (198.51.102.1) 56(84) bytes of data.
--- 198.51.102.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2049ms
================================
Script execution result can be found in storage account:
https://<storage_account_name>.blob.core.windows.net/bmm-run-command-output/a8e0a5fe-3279-46a8-b995-51f2f98a18dd-action-bmmrunreadcmd.tar.gz?se=2023-04-14T06%3A37%3A00Z&sig=XXX&sp=r&spr=https&sr=b&st=2023-04-14T02%3A37%3A00Z&sv=2019-12-12