

# Amazon ECS 任务 IAM 角色
<a name="task-iam-roles"></a>

您的 Amazon ECS 任务可以具有与其关联的 IAM 角色。此 IAM 角色中授予的权限将传递给在任务中运行的容器。此角色允许应用程序代码（在容器上运行）使用其他 AWS 服务。当您的应用程序访问其他 AWS 服务（例如 Amazon S3）时需要任务角色。

**注意**  
Amazon ECS 容器和 Fargate 代理未访问这些权限。有关 Amazon ECS 提取容器映像和运行任务所需的 IAM 权限，请参阅 [Amazon ECS 任务执行 IAM 角色](task_execution_IAM_role.md)。

使用任务角色有以下好处：
+ **分离关注点**：如果您使用的是 EC2，则任务 IAM 角色允许您为容器指定 IAM 权限，而无需使用 EC2 实例配置文件指定这些权限（有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[使用实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)）。这样，您可以在 ECS 容器实例上独立、统一地部署应用程序，而无需修改与 EC2 实例关联的 IAM 权限。
+ **可审计性：**通过 CloudTrail 提供访问和事件日志记录，从而确保追溯审计。任务凭证具有一个会连接到会话的“`taskArn`”上下文，因此 CloudTrail 日志会显示角色凭证传递到的具体任务。
+ **统一交付凭证**：ECS 负责将 IAM 角色凭证交付给容器，从而确保无论任务关联到哪种计算选项，都可以通过定义明确的接口访问这些凭证。在 ECS Fargate 上，EC2 实例配置文件不支持任务中的容器。借助任务 IAM 角色，您可以在容器中使用 AWS SDK 或 AWS CLI 时将 IAM 权限关联到容器，而无论您使用哪种计算选项。有关 AWS SDK 如何访问这些凭证的更多信息，请参阅 [Container credential provider](https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html)。

**重要**  
容器不是安全边界，使用任务 IAM 角色也不能改变这一点。在 Fargate 上运行的任务都有自己的隔离边界，不与其他任务共享底层内核、CPU 资源、内存资源或弹性网络接口。ECS 上的 EC2 和外部容器实例没有任务隔离（与 Fargate 不同），容器有可能访问同一容器实例上其他任务的凭证。此外，容器还有可能会访问分配给 [ECS 容器实例角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html)的权限。按照[角色建议](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-roles.html#security-iam-roles-recommendations)部分的建议操作，为容器阻止对 Amazon EC2 实例元数据服务的访问（有关更多信息，请参阅《Amazon EC2 用户指南》中的[使用实例元数据服务访问实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)**）。  
请注意，在为任务指定 IAM 角色时，AWS CLI 或其他 SDK 在该任务的容器中将仅使用该任务角色提供的 AWS 凭证，而不会从运行任务的 Amazon EC2 或外部实例继承任何 IAM 权限。

## 创建任务 IAM 角色
<a name="create_task_iam_policy_and_role"></a>

在创建供任务使用的 IAM 策略时，该策略必须包括您希望任务中的容器承担的权限。您可以使用现有 AWS 托管策略，也可以从头开始创建满足特定需求的自定义策略。有关更多信息，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

**重要**  
对于 Amazon ECS 任务（适用于所有启动类型），我们建议您为任务使用 IAM 策略和角色。这些凭证允许您的任务在不调用 `sts:AssumeRole` 的情况下发出 AWS API 请求，以担任已与任务关联的相同角色。如果您的任务需要能代入自己的角色，则必须创建明确允许该角色代入自己的信任策略。有关更多信息，请参阅《IAM 用户指南》中的[更新角色信任策略](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_update-role-trust-policy.html)**。

创建 IAM 策略后，您可以创建 IAM 角色，其中包括您在 Amazon ECS 任务定义中引用的策略。您可以在 IAM 控制台中使用 **Elastic Container Service 任务**使用案例创建该角色。然后，可以将您特定的 IAM 策略附加到该角色，其为任务中的容器提供所需的权限。以下过程说明如何执行此操作。

如果您有多个需要 IAM 权限的任务定义或服务，则应考虑为每个特定的任务定义或服务创建一个具有所需最低权限的角色以便任务进行操作，以便您能够将为每个任务提供的访问权限降到最低。

有关您所在区域的服务端点的信息，请参阅《Amazon Web Services 一般参考 指南》**中的[服务端点](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html#ecs_region)。

IAM 任务角色必须具有指定 `ecs-tasks.amazonaws.com` 服务的信任策略。`sts:AssumeRole` 权限允许您的任务承担与 Amazon EC2 实例使用的不同的 IAM 角色。这样，您的任务不会继承与 Amazon EC2 实例关联的角色。以下是信任策略的示例。替换区域标识符并指定启动任务时使用的 AWS 账号。

**重要**  
创建任务 IAM 角色时，建议您在与角色关联的信任关系策略中使用 `aws:SourceAccount` 或 `aws:SourceArn` 条件键进一步限制权限范围，以防止混淆代理安全问题。使用 `aws:SourceArn` 条件键指定当前不受支持的特定集群时，应使用通配符来指定所有集群。要了解更多关于混淆代理问题以及如何保护您的 AWS 账户的信息，请参阅[《IAM 用户指南》](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)中的*混淆代理问题*。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":[
               "ecs-tasks.amazonaws.com"
            ]
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "ArnLike":{
            "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*"
            },
            "StringEquals":{
               "aws:SourceAccount":"111122223333"
            }
         }
      }
   ]
}
```

------

使用以下过程创建策略，通过示例策略从 Amazon S3 检索对象。将所有*用户输入*替换为您自己的值。

------
#### [ AWS 管理控制台 ]

**使用 JSON 策略编辑器创建策略**

1. 登录AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在左侧的导航窗格中，选择**策略**。

   如果这是您首次选择**策略**，则会显示**欢迎访问托管式策略**页面。选择**开始使用**。

1. 在页面的顶部，选择**创建策略**。

1. 在**策略编辑器**部分，选择 **JSON** 选项。

1. 输入以下 JSON 策略文档：

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":[
               "s3:GetObject"
            ],
            "Resource":[
               "arn:aws:s3:::my-task-secrets-bucket/*"
            ]
         }
      ]
   }
   ```

1. 选择**下一步**。
**注意**  
您可以随时在**可视化**和 **JSON** 编辑器选项卡之间切换。不过，如果您进行更改或在**可视化**编辑器中选择**下一步**，IAM 可能会调整策略结构以针对可视化编辑器进行优化。有关更多信息，请参阅*《IAM 用户指南》*中的[调整策略结构](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure)。

1. 在**查看并创建**页面上，为您要创建的策略输入**策略名称**和**描述**（可选）。查看**此策略中定义的权限**以查看策略授予的权限。

1. 选择**创建策略**可保存新策略。

------
#### [ AWS CLI ]

将所有*用户输入*替换为您自己的值。

1. 使用以下内容创建名为 `s3-policy.json` 的文件。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":[
               "s3:GetObject"
            ],
            "Resource":[
               "arn:aws:s3:::my-task-secrets-bucket/*"
            ]
         }
      ]
   }
   ```

------

1. 使用以下命令通过 JSON 策略文档文件创建 IAM 策略。将所有*用户输入*替换为您自己的值。

   ```
   aws iam create-policy \
         --policy-name taskRolePolicy \
         --policy-document file://s3-policy.json
   ```

------

使用以下过程创建服务角色。

------
#### [ AWS 管理控制台 ]

**为 Elastic Container Service 创建服务角色（IAM 控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **AWS 服务**。

1. 对于**服务或使用案例**，选择 **Elastic Container Service**，然后选择 **Elastic Container Service 任务**使用案例。

1. 选择**下一步**。

1. 对于**添加权限**，搜索并选择您创建的策略。

1. 选择**下一步**。

1. 对于**角色名称**，请为您的角色输入一个名称。在此示例中，键入 `AmazonECSTaskS3BucketRole` 以给角色命名。

1. 检查该角色，然后选择**创建角色**。

------
#### [ AWS CLI ]

1. 创建一个名为 `ecs-tasks-trust-policy.json` 的文件，其中包含要用于 IAM 角色的信任策略。该文件应包含以下内容。替换区域标识符并指定启动任务时使用的 AWS 账号。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Principal":{
               "Service":[
                  "ecs-tasks.amazonaws.com"
               ]
            },
            "Action":"sts:AssumeRole",
            "Condition":{
               "ArnLike":{
               "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*"
               },
               "StringEquals":{
                  "aws:SourceAccount":"111122223333"
               }
            }
         }
      ]
   }
   ```

------

1. 使用上一步中创建的信任策略创建命名为 `ecsTaskRole` 的 IAM 角色。

   ```
   aws iam create-role \
         --role-name ecsTaskRole \
         --assume-role-policy-document file://ecs-tasks-trust-policy.json
   ```

1. 使用以下命令检索您创建的 IAM 策略的 ARN。将 *taskRolePolicy* 替换为您创建的策略的名称。

   ```
   aws iam list-policies --scope Local --query 'Policies[?PolicyName==`taskRolePolicy`].Arn'
   ```

1. 将创建的 IAM 策略其附加到 `ecsTaskRole` 角色。将 `policy-arn` 替换为所创建策略的 ARN。

   ```
   aws iam attach-role-policy \
         --role-name ecsTaskRole \
         --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy
   ```

------

创建该角色后，为该角色添加以下功能的附加权限。


|  功能  |  其他权限  | 
| --- | --- | 
|  使用 ECS Exec  |  [ECS Exec 权限](#ecs-exec-required-iam-permissions)  | 
| 使用来自私有 Amazon ECR 存储库的映像 | [Amazon ECR 权限](#ecr-required-iam-permissions) | 
| 使用 EC2 实例（Windows 和 Linux） | [Amazon EC2 实例附加配置](#task-iam-role-considerations) | 
| 使用外部实例 | [外部实例附加配置](#enable_task_iam_roles) | 
| 使用 Windows EC2 实例 | [Amazon EC2 Windows 实例附加配置](#windows_task_IAM_roles) | 

## Amazon ECR 权限
<a name="ecr-required-iam-permissions"></a>

当您的应用程序代码需要直接与 Amazon ECR 存储库交互时，需要以下权限。请注意，对于只需要从 Amazon ECR 提取映像的基本实施，任务 IAM 角色级别不需要这些权限。相反地，Amazon ECS 任务执行角色应该具有这些权限。有关任务执行角色的更多信息，请参阅[Amazon ECS 任务执行 IAM 角色](task_execution_IAM_role.md)。

如果在容器中运行的应用程序代码需要直接与 Amazon ECR API 交互，则应向任务 IAM 角色添加以下权限，并在任务定义中包含任务 IAM 角色。有关更多信息，请参阅 *IAM 用户指南*中的[添加和删除 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

为您的任务 IAM 角色使用以下策略，从而为需要直接与 Amazon ECR 交互的容器应用程序添加所需的 Amazon ECR 权限：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## ECS Exec 权限
<a name="ecs-exec-required-iam-permissions"></a>

[ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) 功能需要一个任务 IAM 角色来授予容器在托管 SSM 代理（`execute-command` 代理）和 SSM 服务之间进行通信所需的权限。您应向任务 IAM 角色添加以下权限，并在任务定义中包含任务 IAM 角色。有关更多信息，请参阅 *IAM 用户指南*中的[添加和删除 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

对于您的任务 IAM 角色使用以下策略来添加所需的 SSM 权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}
```

------

## Amazon EC2 实例附加配置
<a name="task-iam-role-considerations"></a>

建议您将容器实例角色中的权限限制在 `AmazonEC2ContainerServiceforEC2Role` 托管 IAM 策略中使用的最低权限列表的范围内。

Amazon EC2 需要至少为版本 `1.11.0` 的容器代理才能使用任务角色；但建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。如果您使用经 Amazon ECS 优化的 AMI，您的实例需要至少为 `1.11.0-1` 版的 `ecs-init` 程序包。如果您的实例使用最新的经 Amazon ECS 优化的 AMI，则这些实例将包含所需版本的容器代理和 `ecs-init`。有关更多信息，请参阅 [经 Amazon ECS 优化的 Linux AMI](ecs-optimized_AMI.md)。

如果对容器实例使用的不是经 Amazon ECS 优化的 AMI，请将 `--net=host` 选项添加到 **docker run** 命令，该命令会为所需配置启动代理和以下代理配置变量（有关更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)）：

`ECS_ENABLE_TASK_IAM_ROLE=true`  
为具有 `bridge` 和 `default` 网络模式的容器使用任务的 IAM 角色。

`ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true`  
为具有 `host` 网络模式的容器使用任务的 IAM 角色。此变量仅在代理版本 1.12.0 和更高版本上受支持。

有关示例运行命令，请参阅[手动更新 Amazon ECS 容器代理（适用于非经 Amazon ECS 优化的 AMI）](manually_update_agent.md)。您还需要在容器实例上设置以下联网命令，以便任务中的容器可以检索其 AWS 凭证：

```
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
```

您必须将这些 **iptables** 规则保存到容器实例，使其在重启后仍然可用。您可以使用 **iptables-save** 和 **iptables-restore** 命令保存 **iptables** 规则并在启动时还原它们。有关更多信息，请查阅您的特定操作系统文档。

要防止使用 `awsvpc` 网络模式的任务运行的容器访问提供给 Amazon EC2 实例配置文件的凭证信息（同时仍允许任务角色提供的权限），请将代理配置文件中的 `ECS_AWSVPC_BLOCK_IMDS` 代理配置变量设置为 `true`，然后重新启动代理。有关更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

通过在 Amazon EC2 实例上运行以下 **iptables** 命令，阻止使用 `bridge` 网络模式的任务运行的容器访问提供给 Amazon EC2 实例配置文件的凭证信息，同时仍允许任务角色提供的权限。此命令不影响使用 `host` 或 `awsvpc` 网络模式的任务中的容器。有关更多信息，请参阅 [网络模式](task_definition_parameters.md#network_mode)。
+ 

  ```
  sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
  ```

  您必须将此 **iptables** 规则保存到 Amazon EC2 实例上，使其在重启后仍然可用。使用经 Amazon ECS 优化的 AMI，您可以使用以下命令。对于其他操作系统，请参阅该操作系统的相关文档。

  ```
  sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  ```

## 外部实例附加配置
<a name="enable_task_iam_roles"></a>

外部实例需要至少为版本 `1.11.0` 的容器代理才能使用任务 IAM 角色；但建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。如果您正在使用经 Amazon ECS 优化的 AMI，您的实例将需要至少为 `1.11.0-1` 版的 `ecs-init` 程序包。如果您的实例使用最新的经 Amazon ECS 优化的 AMI，则这些实例将包含所需版本的容器代理和 `ecs-init`。有关更多信息，请参阅 [经 Amazon ECS 优化的 Linux AMI](ecs-optimized_AMI.md)。

如果对容器实例使用的不是经 Amazon ECS 优化的 AMI，请将 `--net=host` 选项添加到 **docker run** 命令，该命令会为所需配置启动代理和以下代理配置变量（有关更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)）：

`ECS_ENABLE_TASK_IAM_ROLE=true`  
为具有 `bridge` 和 `default` 网络模式的容器使用任务的 IAM 角色。

`ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true`  
为具有 `host` 网络模式的容器使用任务的 IAM 角色。此变量仅在代理版本 1.12.0 和更高版本上受支持。

有关示例运行命令，请参阅[手动更新 Amazon ECS 容器代理（适用于非经 Amazon ECS 优化的 AMI）](manually_update_agent.md)。您还需要在容器实例上设置以下联网命令，以便任务中的容器可以检索其 AWS 凭证：

```
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
```

您必须将这些 **iptables** 规则保存到容器实例，使其在重启后仍然可用。您可以使用 **iptables-save** 和 **iptables-restore** 命令保存 **iptables** 规则并在启动时还原它们。有关更多信息，请查阅您的特定操作系统文档。

## Amazon EC2 Windows 实例附加配置
<a name="windows_task_IAM_roles"></a>

**重要**  
这仅适用于 EC2 上使用任务角色的 Windows 容器。

具有 Windows 功能的任务角色需要在 EC2 上进行附加配置。
+ 在启动容器实例时，您必须在容器实例用户数据脚本中设置 `-EnableTaskIAMRole` 选项。`EnableTaskIAMRole` 为任务打开任务 IAM 角色功能。例如：

  ```
  <powershell>
  Import-Module ECSTools
  Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole 
  </powershell>
  ```
+ 您必须使用[Amazon ECS 容器引导脚本](#windows_task_IAM_roles_bootstrap)中提供的联网命令来引导容器。
+ 您必须为任务创建 IAM 角色和策略。有关更多信息，请参阅 [创建任务 IAM 角色](#create_task_iam_policy_and_role)。
+ 任务的 IAM 角色凭证提供程序在容器实例上使用端口 80。因此，如果在容器实例上配置任务的 IAM 角色，则容器无法将端口 80 用于任何端口映射中的主机端口。要在端口 80 上公开容器，建议您为这些容器配置一个使用负载平衡功能的服务。您可以在负载均衡器上使用端口 80。通过这样做，可以将流量传送到容器实例上的另一个主机端口。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。
+ 如果重新启动 Windows 实例，则必须删除代理接口并再次初始化 Amazon ECS 容器代理以备份凭证代理。

### Amazon ECS 容器引导脚本
<a name="windows_task_IAM_roles_bootstrap"></a>

必须先使用所需的联网命令引导容器，然后容器才能访问容器实例上的凭证代理来获得凭证。当容器启动时，应在容器上运行以下代码示例脚本。

**注意**  
在 Windows 上使用 `awsvpc` 网络模式时，不需要运行此脚本。

如果您运行包含 Powershell 的 Windows 容器，请使用以下脚本：

```
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may
# not use this file except in compliance with the License. A copy of the
# License is located at
#
#	http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
 
$gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API
New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API
```

如果您运行的 Windows 容器只有命令 shell，请使用以下脚本：

```
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may
# not use this file except in compliance with the License. A copy of the
# License is located at
#
#	http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
 
for /f "tokens=1" %i  in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i
for /f "tokens=3" %i  in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i
netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API
netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API
```