

AWS App Runner 从 2026 年 4 月 30 日起，将不再向新客户开放。如果您想使用 App Runner，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS App Runner 可用性变更](https://docs.aws.amazon.com/apprunner/latest/dg/apprunner-availability-change.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 引用环境变量
<a name="env-variable"></a>

借助 App Runner，您可以在[创建服务或[更新](manage-configure.md)服务时将机密和配置作为服务](manage-create.md)中的环境变量引用。

您可以将非敏感配置数据（例如超时和重试次数）以**纯文本形式**引用为键值对。您在**纯文本**中引用的配置数据未经过加密，其他人可以在 App Runner 服务配置和应用程序日志中看到这些数据。

**注意**  
出于安全考虑，请勿在 App Runner 服务中以**纯文本形式**引用任何敏感数据。

## 将敏感数据引用为环境变量
<a name="env-variable.sensitivedata"></a>

App Runner 支持在服务中安全地将敏感数据引用为环境变量。考虑将要引用的敏感数据存储在我们的 P *AWS Systems Manager arameter St *AWS Secrets Manager*ore* 中。然后，您可以从 App Runner 控制台或通过调用 API 在服务中安全地将它们作为环境变量引用。这样可以有效地将密钥和参数管理与应用程序代码和服务配置分开，从而提高在 App Runner 上运行的应用程序的整体安全性。

**注意**  
App Runner 不会因为将 Secrets Manager 和 SSM Parameter Store 引用为环境变量而向你收取费用。但是，使用 Secrets Manager 和 SSM Parameter Store 需要支付标准价格。  
有关定价的更多信息，请参阅以下内容：  
 [AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing)
 [AWS SSM 参数存储定价](https://aws.amazon.com/systems-manager/pricing) 

 以下是将敏感数据作为环境变量引用的过程：

1. 将敏感数据（例如 API 密钥、数据库凭据、数据库连接参数或应用程序版本）作为机密或参数存储在任一 AWS Secrets Manager 或 Paramet AWS Systems Manager er Store 中。

1. 更新您的实例角色的 IAM 策略，这样 App Runner 就可以访问存储在 Secrets Manager 和 SSM Parameter Store 中的机密和参数。有关更多信息，请参阅 [ 权限](#env-variable.sensitivedata.permissions)。

1. 通过指定名称并提供其 Amazon 资源名称 (ARN)，将密钥和参数安全地引用为环境变量。您可以在[创建服务或更新服务](manage-create.md)[配置](manage-configure.md)时添加环境变量。您可以使用以下选项之一来添加环境变量：
   +  应用程序运行器控制台 
   +  应用程序运行器 API 
   +  `apprunner.yaml` 配置文件 
**注意**  
在创建或更新 `PORT` App Runner 服务时，不能将环境变量指定为名称。它是 App Runner 服务的预留环境变量。

   有关如何引用密钥和参数的更多信息，请参阅[管理环境变量](env-variable-manage.md)。

**注意**  
 由于 App Runner 仅存储对机密和参数的引用 ARNs，因此其他人无法在 App Runner 服务配置和应用程序日志中看到敏感数据。

## 注意事项
<a name="env-variable.sensitivedata.considerations"></a>
+ 请务必更新您的实例角色，使其具有访问参数存储中 AWS Secrets Manager 或其中的密钥和 AWS Systems Manager 参数的相应权限。有关更多信息，请参阅 [ 权限](#env-variable.sensitivedata.permissions)。
+ 确保 AWS Systems Manager Parameter Store AWS 账户 与您要启动或更新的服务位于同一位置。目前，您无法跨账户引用 SSM 参数存储参数。
+ 轮换或更改密钥和参数值时，它们不会在您的 App Runner 服务中自动更新。重新部署你的 App Runner 服务，因为 App Runner 在部署期间仅提取机密和参数。
+ 您还可以选择通过 App Runner 服务中的 SDK 直接调用 AWS Secrets Manager 和 P AWS Systems Manager arameter Store。
+ 为避免错误，在将它们引用为环境变量时，请确保以下几点：
  + 您可以指定密钥的正确 ARN。
  + 您可以指定参数的正确名称或 ARN。

## Permissions
<a name="env-variable.sensitivedata.permissions"></a>

要启用引用存储在 AWS Secrets Manager 或 SSM Parameter Store 中的密钥和参数，请向您的*实例角色*的 IAM 策略添加相应的权限，以访问 Secrets Manager 和 SSM Parameter Store。

**注意**  
 未经您的许可，App Runner 无法访问您账户中的资源。您可以通过更新您的 IAM 政策来提供权限。

您可以使用以下策略模板在 IAM 控制台中更新您的实例角色。您可以修改这些策略模板以满足您的特定要求。有关更新实例角色的更多信息，请参阅 *IAM 用户指南*中的[修改角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html)。

**注意**  
[创建环境变量](env-variable-manage.md#env-variable-manage.console)时，您也可以从 App Runner 控制台复制以下模板。

将以下模板复制到您的实例角色中，以添加引用*密钥*的权限*AWS Secrets Manager*。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "secretsmanager:GetSecretValue",
            "kms:Decrypt*"
        ],
        "Resource": [
            "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret",
            "arn:aws:kms:us-east-1:111122223333:key/my-key"
         ]
     }
   ]
}
```

------

将以下模板复制到您的实例角色，以添加从 P *AWS Systems Manager*arameter Store 引用*参数*的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": [
            "arn:aws:ssm:us-east-1:111122223333:parameter/my-parameter"
            ]
        }
    ]
}
```

------

# 管理您的环境变量
<a name="env-variable-manage"></a>

使用以下方法之一管理 App Runner 服务的环境变量：
+ [应用程序运行器控制台](#env-variable-manage.console)
+ [应用程序运行器 API 或 AWS CLI](#env-variable-manage.api)

## 应用程序运行器控制台
<a name="env-variable-manage.console"></a>

在 App Runner 控制台上[创建服务](manage-create.md)[或更新](manage-configure.md)服务时，可以添加环境变量。

### 添加环境变量
<a name="env-variable-manage.console.add"></a>

**添加环境变量**

1. 打开 [App Runner 控制台](https://console.aws.amazon.com/apprunner)，然后在 “**区域**” 列表中，选择您的 AWS 区域。

1. 根据您是在创建还是更新服务，执行以下步骤之一：
   + 如果您要创建新服务，请选择**创建 App Runner 服务**，然后转到**配置服务**。
   +  如果您要更新现有服务，请选择要更新的服务，然后转到该服务的**配置**选项卡。

1.  转到**环境变量-在 **“服务设置”** 下可选**。

1.  根据您的要求选择以下任一选项：
   + 从**环境变量源**中选择**纯文本**，然后分别在环境变**量名称和环境变量****值下输入其键值**对。
**注意**  
如果要引用非敏感数据，请选择**纯文本**。这些数据未经加密，在 App Runner 服务配置和应用程序日志中对其他人可见。
   + 从**环境变量源**中选择 Secr **ets Manager**，以引用 AWS Secrets Manager 作为环境变量存储在服务中的密钥。**分别在环境变量名称和环境变量值下提供您所引用的密钥的**环境变量名称和亚马逊资源名称** (ARN)。**
   + 从**环境变量源**中选择 **SSM 参数存储**，将存储在 SSM 参数存储中的参数作为服务中的环境变量引用。**分别在环境变量名称和环境变量值下提供您所引用的参数的**环境变量名称**和 ARN。**
**注意**  
在创建或更新 `PORT` App Runner 服务时，不能将环境变量指定为名称。它是 App Runner 服务的保留环境变量。
 如果 SSM 参数存储参数与您要启动的服务 AWS 区域 相同，则可以指定完整的 Amazon 资源名称 (ARN) 或参数名称。如果参数位于不同的区域，则需要指定完整的 ARN。
确保你所引用的参数与你正在启动或更新的服务位于同一个账户中。目前，您无法跨账户引用 SSM 参数存储参数。

1. 选择**添加环境变量**以引用另一个环境变量。

1. 展开 **IAM 策略模板**以查看和复制为 AWS Secrets Manager 和 SSM Parameter Store 提供的 IAM 策略模板。只有在您尚未使用所需权限更新实例角色的 IAM 策略时，才需要执行此操作。有关更多信息，请参阅 [ 权限](env-variable.md#env-variable.sensitivedata.permissions)。

### 移除环境变量
<a name="env-variable-manage.console.remove"></a>

在删除环境变量之前，请确保更新您的应用程序代码以反映相同的内容。如果应用程序代码未更新，则您的 App Runner 服务可能会失败。

**移除环境变量**

1. 打开 [App Runner 控制台](https://console.aws.amazon.com/apprunner)，然后在 “**区域**” 列表中，选择您的 AWS 区域。

1.  转到要更新的服务的**配置**选项卡。

1.  转到**环境变量-在 **“服务设置”** 下可选**。

1.  选择要**移除**的环境变量旁边的 “移除”。您会收到一条确认删除的消息。

1.  选择**删除**。

## 应用程序运行器 API 或 AWS CLI
<a name="env-variable-manage.api"></a>

您可以引用 Secrets Manager 和 SSM Parameter Store 中存储的敏感数据，方法是将它们作为环境变量添加到服务中。

**注意**  
更新您的实例角色的 IAM 策略，这样 App Runner 就可以访问存储在 Secrets Manager 和 SSM Parameter Store 中的机密和参数。有关更多信息，请参阅 [ 权限](env-variable.md#env-variable.sensitivedata.permissions)。

**将密钥和配置作为环境变量引用**

1. 在 Secrets Manager 或 SSM 参数存储区中创建密钥或配置。

   以下示例说明如何使用 SSM 参数存储区创建密钥和参数。  
**Example 创建密钥-请求**  

   以下示例说明如何创建代表数据库凭证的密钥。

   ```
   aws secretsmanager create-secret \
   —name DevRdsCredentials \
   —description "Rds credentials for development account." \
   —secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}"
   ```  
**Example 创建密钥-响应**  

   ```
   arn:aws:secretsmanager:<region>:<aws_account_id>:secret:DevRdsCredentials
   ```  
**Example 创建配置-请求**  

   以下示例说明如何创建表示 RDS 连接字符串的参数。

   ```
   aws systemsmanager put-parameter \
   —name DevRdsConnectionString \
   —value "mysql2://dev-mysqlcluster-rds.com:3306/diegor" \
   —type "String" \
   —description "Rds connection string for development account."
   ```  
**Example 创建配置-响应**  

   ```
   arn:aws:ssm:<region>:<aws_account_id>:parameter/DevRdsConnectionString
   ```

1. 通过将存储在 Secrets Manager 和 SSM Parameter Store 中的密钥和配置添加为环境变量来引用它们。您可以在创建或更新 App Runner 服务时添加环境变量。

   以下示例说明如何在基于代码和基于图像的 App Runner 服务上将密钥和配置作为环境变量引用。  
**Example 基于图像的 App Runner 服务的输入.json 文件**  

   ```
   {
     "ServiceName": "example-secrets",
     "SourceConfiguration": {
       "ImageRepository": {
         "ImageIdentifier": "<image-identifier>",
         "ImageConfiguration": {
           "Port": "<port>",
           "RuntimeEnvironmentSecrets": {
             "Credential1":"arn:aws:secretsmanager:<region>:<aws_account_id>:secret:XXXXXXXXXXXX",
             "Credential2":"arn:aws:ssm:<region>:<aws_account_id>:parameter/<parameter-name>"
           }
         },
         "ImageRepositoryType": "ECR_PUBLIC"
       }
     },
     "InstanceConfiguration": {
       "Cpu": "1 vCPU",
       "Memory": "3 GB",
       "InstanceRoleArn": "<instance-role-arn>"
     }
   }
   ```  
**Example 基于图像的 App Runner 服务-请求**  

   ```
   aws apprunner create-service \
   --cli-input-json file://input.json
   ```  
**Example 基于图像的 App Runner 服务-响应**  

   ```
   {
   ...
         "ImageRepository": {
            "ImageIdentifier":"<image-identifier>",
            "ImageConfiguration":{
               "Port": "<port>",
               "RuntimeEnvironmentSecrets":{
                  "Credential1": "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:XXXXXXXXXXXX",
                  "Credential2": "arn:aws:ssm:<region>:<aws_account_id>:parameter/<parameter-name>"
               },                
               "ImageRepositoryType":"ECR"
         }      
      },
      "InstanceConfiguration": {
           "CPU": "1 vCPU",
           "Memory": "3 GB",
           "InstanceRoleArn: "<instance-role-arn>"
      }
   ...
   }
   ```  
**Example 基于代码的 App Runner 服务的输入.json 文件**  

   ```
   {
     "ServiceName": "example-secrets",
     "SourceConfiguration": {
       "AuthenticationConfiguration": {
         "ConnectionArn": "arn:aws:apprunner:us-east-1:123456789012:connection/my-github-connection/XXXXXXXXXX"
       },
       "AutoDeploymentsEnabled": false,
       "CodeRepository": {
         "RepositoryUrl": "<repository-url>",
         "SourceCodeVersion": {
           "Type": "BRANCH",
           "Value": "main"
         },
         "CodeConfiguration": {
           "ConfigurationSource": "API",
           "CodeConfigurationValues": {
             "Runtime": "<runtime>",
             "BuildCommand": "<build-command>",
             "StartCommand": "<start-command>",
             "Port": "<port>",
             "RuntimeEnvironmentSecrets": {
               "Credential1":"arn:aws:secretsmanager:<region>:<aws_account_id>:secret:XXXXXXXXXXXX",
               "Credential2":"arn:aws:ssm:<region>:<aws_account_id>:parameter/<parameter-name>"
             }
           }
         }
       }
     },
     "InstanceConfiguration": {
       "Cpu": "1 vCPU",
       "Memory": "3 GB",
       "InstanceRoleArn": "<instance-role-arn>"
     }
   }
   ```  
**Example 基于代码的 App Runner 服务-请求**  

   ```
   aws apprunner create-service \
   --cli-input-json file://input.json
   ```  
**Example 基于代码的 App Runner 服务-响应**  

   ```
   {
   ...
      "SourceConfiguration":{
         "CodeRepository":{
            "RepositoryUrl":"<repository-url>",
            "SourceCodeVersion":{
               "Type":"Branch",
               "Value":"main"
            },
            "CodeConfiguration":{
               "ConfigurationSource":"API",
               "CodeConfigurationValues":{
                  "Runtime":"<runtime>",
                  "BuildCommand":"<build-command>",
                  "StartCommand":"<start-command>",
                  "Port":"<port>",               
                  "RuntimeEnvironmentSecrets":{
                     "Credential1" : "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:XXXXXXXX",
                     "Credential2" : "arn:aws:ssm:<region>:<aws_account_id>:parameter/<parameter-name>"
                  } 
               }
            }
         },
         "InstanceConfiguration": {
           "CPU": "1 vCPU",
           "Memory": "3 GB",
           "InstanceRoleArn: "<instance-role-arn>"
      }
   ...
   }
   ```

1. `apprunner.yaml`模型已更新，以反映新增的秘密。

   以下是更新后的`apprunner.yaml`模型的示例。  
**Example `apprunner.yaml`**  

   ```
   version: 1.0
   runtime: python3
   build:
     commands:
       build:
         - python -m pip install flask
   run:
     command: python app.py
     network:
       port: 8080
     env:
       - name: MY_VAR_EXAMPLE
         value: "example"
     secrets:
       - name: my-secret
         value-from: "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:XXXXXXXXXXXX"
       - name: my-parameter
         value-from: "arn:aws:ssm:<region>:<aws_account_id>:parameter/<parameter-name>"
       - name: my-parameter-only-name
         value-from: "parameter-name"
   ```