

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

# `AWSSupport-SetupK8sApiProxyForEKS`
<a name="automation-awssupport-setupk8sapiproxyforeks"></a>

 **描述** 

**AWSSupport-SetupK8 sApiProxy ForeKs** 自动化运行手册提供了一种创建函数的方法，该 AWS Lambda 函数充当对亚马逊 Elastic Kubernetes Service 集群终端节点进行控制平面 API 调用的代理。它可以作为运行手册的构建块，这些运行手册需要调用控制平面 API 来自动执行任务和排除 Amazon EKS 集群的问题。

**重要**  
此自动化创建的所有资源都已标记，因此可以轻松找到它们。使用的标签是：  
 `AWSSupport-SetupK8sApiProxyForEKS`：true 

**注意**  
自动化是一个辅助运行手册，不能作为独立运行手册执行。对于需要对 Amazon EKS 集群进行控制平面 API 调用的运行手册，它被当作子级自动化调用。
请确保在使用后进行`Cleanup`操作，以免产生不必要的费用。

**文档类型**

自动化

**所有者**

Amazon

**平台**

Linux

**参数**
+ AutomationAssumeRole

  类型：字符串

  描述：（可选）允许 Systems Manager Automation 代表您执行操作 AWS Identity and Access Management (IAM) 角色的 Amazon 资源名称（ARN）。如果未指定角色，Systems Manager Automation 将使用启动此运行手册的用户的权限。
+ ClusterName

  类型：字符串

  描述：（必填）亚马逊 Elastic Kubernetes Service 集群的名称。
+ 操作

  类型：字符串

  描述：（必需）要执行的操作：`Setup`在账户中配置 Lambda 函数，`Cleanup`将取消配置在设置阶段创建的资源。

  允许的值：`Setup`\$1 `Cleanup`

  默认：设置
+ LambdaRoleArn

  类型：字符串

  描述：（可选）允许该 AWS Lambda 函数访问所需 AWS 服务和资源的 IAM 角色的 ARN。如果未指定任何角色，则此 Systems Manager Automation 将在您的账户中为 Lambda 创建一个 IAM 角色`Automation-K8sProxy-Role-<ExecutionId>`，其名称包含托管策略：`AWSLambdaBasicExecutionRole`和。`AWSLambdaVPCAccessExecutionRole`

 **如何工作？** 

 运行手册执行以下步骤：
+ 验证自动化是否作为子执行运行。当作为独立运行手册调用时，运行手册将不起作用，因为它本身无法执行任何有意义的工作。
+ 检查指定集群的代理 Lambda 函数的现有 CloudFormation 堆栈。
  + 如果堆栈存在，则会重复使用现有基础架构，而不是重新创建它。
  + 参考计数器使用标签进行维护，以确保如果运行手册被同一集群的另一个 runbook 重复使用，则该运行手册不会删除该基础架构。
+ 执行为调用指定的操作类型 (`Setup`/`Cleanup`)：
  + **设置：**创建或描述现有资源。

    **清理：**如果任何其他 runbook 未使用基础架构，则移除已配置的资源。

 **所需的 IAM 权限** 

该`AutomationAssumeRole`参数需要以下权限` LambdaRoleArn`未通过：
+  `cloudformation:CreateStack` 
+  `cloudformation:DescribeStacks` 
+  `cloudformation:DeleteStack` 
+  `cloudformation:UpdateStack` 
+  `ec2:CreateNetworkInterface` 
+  `ec2:DescribeNetworkInterfaces` 
+  `ec2:DescribeRouteTables` 
+  `ec2:DescribeSecurityGroups` 
+  `ec2:DescribeSubnets` 
+  `ec2:DescribeVpcs` 
+  `ec2:DeleteNetworkInterface` 
+  `eks:DescribeCluster` 
+  `lambda:CreateFunction` 
+  `lambda:DeleteFunction` 
+  `lambda:ListTags` 
+  `lambda:GetFunction` 
+  `lambda:ListTags` 
+  `lambda:TagResource` 
+  `lambda:UntagResource` 
+  `lambda:UpdateFunctionCode` 
+  `logs:CreateLogGroup` 
+  `logs:PutRetentionPolicy` 
+  `logs:TagResource` 
+  `logs:UntagResource` 
+  `logs:DescribeLogGroups` 
+  `logs:DescribeLogStreams` 
+  `logs:ListTagsForResource` 
+  `iam:CreateRole` 
+  `iam:AttachRolePolicy` 
+  `iam:DetachRolePolicy` 
+  `iam:PassRole` 
+  `iam:GetRole` 
+  `iam:DeleteRole` 
+  `iam:TagRole` 
+  `iam:UntagRole` 
+  `tag:GetResources` 
+  `tag:TagResources` 

如果`LambdaRoleArn`提供了自动化，则无需创建角色，并且可以排除以下权限：
+  `iam:CreateRole` 
+  `iam:DeleteRole` 
+  `iam:TagRole` 
+  `iam:UntagRole` 
+  `iam:AttachRolePolicy` 
+  `iam:DetachRolePolicy` 

以下是一个策略示例，演示了未通过` AutomationAssumeRole``LambdaRoleArn`时所需的权限：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "tag:GetResources",
                "tag:TagResources",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:DeleteNetworkInterface",
                "eks:DescribeCluster",
                "iam:GetRole",
                "cloudformation:DescribeStacks",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "lambda:GetFunction",
                "lambda:ListTags",
                "logs:ListTagsForResource"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "AllowActionsWithoutConditions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": "iam:CreateRole",
            "Resource": [
                "arn:aws:iam::111122223333:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "AllowCreateRoleWithRequiredTag"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "iam:DeleteRole",
                "iam:TagRole",
                "iam:UntagRole"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "IAMActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                },
                "StringLike": {
                    "iam:PolicyARN": [
                        "arn:aws:iam::111122223333:policy/service-role/AWSLambdaBasicExecutionRole",
                        "arn:aws:iam::111122223333:policy/service-role/AWSLambdaVPCAccessExecutionRole"
                    ]
                }
            },
            "Action": [
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "AttachRolePolicy"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:TagResource",
                "lambda:UntagResource",
                "lambda:UpdateFunctionCode"
            ],
            "Resource": "arn:aws:lambda:us-east-1:111122223333:function:Automation-K8sProxy*",
            "Effect": "Allow",
            "Sid": "LambdaActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "arn:aws:cloudformation:us-east-1:111122223333:stack/AWSSupport-SetupK8sApiProxyForEKS*",
            "Effect": "Allow",
            "Sid": "CloudFormationActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutRetentionPolicy",
                "logs:TagResource",
                "logs:UntagResource"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111122223333:log-group:/aws/lambda/Automation-K8sProxy*",
                "arn:aws:logs:us-east-1:111122223333:log-group:/aws/lambda/Automation-K8sProxy*:*"
            ],
            "Effect": "Allow",
            "Sid": "LogsActions"
        },
        {
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "lambda.amazonaws.com"
                }
            },
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/Automation-K8sProxy-Role*"
            ],
            "Effect": "Allow",
            "Sid": "PassRoleToLambda"
        }
    ]
}
```

------

 如果通过，请确保它已为公共集群以及私有集群附加了[ AWSLambdaBasicExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaBasicExecutionRole)策略。`LambdaRoleArn` [ AWSLambdaVPCAccessExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaVPCAccessExecutionRole)

 **资源已创建** 

以下资源是在`Setup`操作期间创建的：

1. AWS Lambda 函数

1. IAM 角色：Lambda 执行角色（如果未提供）。

1. CloudWatch 日志组（Lambda 日志）

 *在执行`Cleanup`操作之前，Lambda 函数和执行角色将一直保留。Lambda 日志组将保留 30 天或直到手动删除。*

 **说明** 

运行手册是一个辅助工具，旨在作为子自动化从其他运行手册中执行。它促进了基础设施的创建，使父运行手册能够调用 Amazon EKS K8s 控制平面 API。要使用运行手册，您可以在父自动化的上下文中执行以下步骤。

1. **设置阶段**：使用运行手册中的` aws:executeAutomation`操作调用自动化，该操作要在操作设置为的情况下进行 Amazon EKS K8s 控制平面 API 调用。`Setup`

   输入参数示例：

   ```
      {
        "AutomationAssumeRole": "<role-arn>",
        "ClusterName": "<eks-cluster-name>",
        "Operation": "Setup"
      }
   ```

   该`aws:executeAutomation`步骤的输出将包含代理 Lambda 函数的 ARN。

1. **使用 Lambda 代理**：使用` Lambda.Client.invoke(...)`带有 API 调用路径列表和持有者令牌`boto3`的，在`aws:executeScript`操作中调用 Lambda 函数。Lambda 函数将通过将持有者令牌作为授权标头的一部分传递来对指定路径执行 HTTP `GET` 调用。

   Lambda 调用事件的示例：

   ```
      {
          "ApiCalls": ["/api/v1/pods/", ...],
          "BearerToken": "..."
      }
   ```
**注意**  
持有者令牌必须作为父级自动化脚本的一部分生成。您需要确保执行父运行手册的委托人拥有对指定 Amazon EKS 集群的只读权限。

1. **清理阶段**：使用运行手册中的` aws:executeAutomation`操作调用自动化，该操作要在操作设置为的情况下进行 Amazon EKS K8s 控制平面 API 调用。`Cleanup`

   输入参数示例：

   ```
      {
        "AutomationAssumeRole": "<role-arn>",
        "ClusterName": "<eks-cluster-name>",
        "Operation": "Cleanup"
      }
   ```

 **自动化步骤** 

1.  **ValidateExecution** 
   + 验证自动化是否未作为独立执行运行。

1.  **CheckForExistingStack** 
   + 检查是否已经为指定的集群名称配置了 CloudFormation 堆栈。
   + 返回堆栈存在状态以及是否可以安全删除。

1.  **BranchOnIsStackExists** 
   + 基于堆栈存在情况进行分支的决策步骤。
   + 更新现有堆栈名称或继续操作分支的路由。

1.  **UpdateStackName** 
   + 使用现有堆栈的名称更新`StackName`变量。
   + 仅在堆栈已经存在时才执行。

1.  **BranchOnOperation** 
   + 根据`Operation`参数 (`Setup`/`Cleanup`) 对自动化进行路由。
   + For`Setup`：创建新堆栈或描述现有资源的路由。
   + Fo `Cleanup` r：如果可以安全删除，则继续删除堆栈。

1.  **GetClusterNetworkConfig** 
   + 描述用于获取 VPC 配置的 Amazon EKS 集群。
   + 检索终端节点、VPC ID IDs、子网、安全组 ID 和 CA 数据。

1.  **ProvisionResources** 
   + 使用所需资源创建 CloudFormation 堆栈。
   + 使用必要的网络配置配置 Lambda 函数。
   + 为所有资源添加标签以进行跟踪和管理。

1.  **DescribeStackResources** 
   + 检索有关 created/existing 堆栈的信息。
   + 获取已配置的 Lambda 函数的 ARN。

1.  **BranchOnIsLambdaDeploymentRequired** 
   + 确定是否需要部署 Lambda 代码。
   + 仅对新创建的堆栈进行部署。

1.  **DeployLambdaFunctionCode** 
   + 使用部署包部署 Lambda 函数代码。
   + 使用代理实现更新函数。

1.  **AssertLambdaAvailable** 
   + 验证 Lambda 函数代码更新是否成功。
   + 等待函数进入`Successful`状态。

1.  **PerformStackCleanup** 
   + 删除 CloudFormation 堆栈和相关资源。
   + 在`Cleanup`操作期间或操作失败时执行。` Setup`

 **输出** 

*LambdaFunctionArn*: 代理 Lambda 函数的 ARN

**参考**

Systems Manager Automation
+ [运行自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [设置自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [Support 自动化工作流程](https://aws.amazon.com/premiumsupport/technology/saw/)