练习 - 设置环境变量
借助环境变量,可动态配置容器运行的应用程序或脚本。 创建容器时,可使用 Azure CLI、PowerShell 或 Azure 门户设置变量。 安全环境变量可防止容器输出中显示敏感信息。
创建 Azure Cosmos DB 实例,并使用环境变量将连接信息传递给 Azure 容器实例。 容器中的应用程序使用变量从 Azure Cosmos DB 写入并读取数据。 创建一个环境变量和一个安全环境变量,这样你就可以看到它们之间的区别。
部署 Azure Cosmos DB
部署 Azure Cosmos DB 时,需提供唯一的数据库名称。 为便于学习,请通过 Cloud Shell 运行此命令,以创建包含唯一名称的 Bash 变量:
COSMOS_DB_NAME=aci-cosmos-db-$RANDOM
运行此
az cosmosdb create
命令以创建 Azure Cosmos DB 实例:COSMOS_DB_ENDPOINT=$(az cosmosdb create \ --resource-group learn-deploy-aci-rg \ --name $COSMOS_DB_NAME \ --query documentEndpoint \ --output tsv)
此命令可能需要几分钟才能完成。
$COSMOS_DB_NAME
指定了唯一的数据库名称。 该命令会打印数据库的终结点地址。 在本课中,该命令将此地址保存到 Bash 变量COSMOS_DB_ENDPOINT
。运行
az cosmosdb keys list
以获取 Azure Cosmos DB 连接密钥,并将其存储在名为COSMOS_DB_MASTERKEY
的 Bash 变量中:COSMOS_DB_MASTERKEY=$(az cosmosdb keys list \ --resource-group learn-deploy-aci-rg \ --name $COSMOS_DB_NAME \ --query primaryMasterKey \ --output tsv)
部署适用于数据库的容器
创建一个 Azure 容器实例,该实例可读取和写入 Azure Cosmos DB 实例的记录。
你在上一部分 COSMOS_DB_ENDPOINT
和 COSMOS_DB_MASTERKEY
中创建的两个环境变量包含连接到 Azure Cosmos DB 实例所需的值。
运行以下
az container create
命令来创建容器:az container create \ --resource-group learn-deploy-aci-rg \ --name aci-demo \ --image mcr.microsoft.com/azuredocs/azure-vote-front:cosmosdb \ --ip-address Public \ --location eastus \ --environment-variables \ COSMOS_DB_ENDPOINT=$COSMOS_DB_ENDPOINT \ COSMOS_DB_MASTERKEY=$COSMOS_DB_MASTERKEY
azuredocs/azure-vote-front:cosmosdb 指的是运行虚构投票应用的容器映像。
请记下
--environment-variables
参数。 此参数指定了容器启动时传递给容器的环境变量。 容器映像配置为查找这些环境变量。 传递 Azure Cosmos DB 终结点的名称及其连接密钥。运行
az container show
命令以获取容器的公共 IP 地址:az container show \ --resource-group learn-deploy-aci-rg \ --name aci-demo \ --query ipAddress.ip \ --output tsv
在浏览器中,转到容器的 IP 地址。
重要
有时,容器需要一到两分钟才能完全启动及能够接收连接。 如果在浏览器中转到该 IP 地址时没有响应,请稍等片刻并刷新页面。
一旦应用可用,即可看到此页:
尝试为“猫”和“狗”投票。 每次投票都存储在 Azure Cosmos DB 实例中。
使用安全环境变量隐藏连接信息
在上一部分中,你使用了两个环境变量来创建容器。 默认情况下,可通过 Azure 门户和命令行工具以纯文本形式访问这些环境变量。
在本部分中,学习如何防止敏感信息(如连接密钥)以纯文本显示。
让我们首先看看当前行为。 运行以下
az container show
命令,显示容器的环境变量:az container show \ --resource-group learn-deploy-aci-rg \ --name aci-demo \ --query containers[0].environmentVariables
你将得到包含两个纯文本值的输出。 下面是一个示例:
[ { "name": "COSMOS_DB_ENDPOINT", "secureValue": null, "value": "https://aci-cosmos.documents.azure.com:443/" }, { "name": "COSMOS_DB_MASTERKEY", "secureValue": null, "value": "abcdefghijklmnopqrztuvwxyz0123456789==" } ]
虽然这些值不会通过投票应用程序显示给用户,但确保敏感信息(例如连接密钥)不以纯文本形式存储是一项很好的安全措施。
安全环境变量可防止明文输出。 若要使用安全环境变量,请使用
--secure-environment-variables
参数而不是--environment-variables
参数。运行以下命令,再创建一个名为 aci-demo-secure 的容器,它使用安全环境变量:
az container create \ --resource-group learn-deploy-aci-rg \ --name aci-demo-secure \ --image mcr.microsoft.com/azuredocs/azure-vote-front:cosmosdb \ --ip-address Public \ --location eastus \ --secure-environment-variables \ COSMOS_DB_ENDPOINT=$COSMOS_DB_ENDPOINT \ COSMOS_DB_MASTERKEY=$COSMOS_DB_MASTERKEY
请注意
--secure-environment-variables
参数的使用。运行以下
az container show
命令,显示容器的环境变量:az container show \ --resource-group learn-deploy-aci-rg \ --name aci-demo-secure \ --query containers[0].environmentVariables
此时,你可以看到环境变量不以纯文本形式显示:
[ { "name": "COSMOS_DB_ENDPOINT", "secureValue": null, "value": null }, { "name": "COSMOS_DB_MASTERKEY", "secureValue": null, "value": null } ]
实际上,环境变量的值根本不会出现。 这不重要,因为这些值指的是敏感信息。 此处,你只需要知道环境变量的存在。