

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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

 **Descripción** 

El manual de automatización de **AWSSupport-SetupK8 sApiProxy ForeKS** proporciona una forma de crear una AWS Lambda función que actúa como proxy para realizar llamadas a la API del plano de control al punto final del clúster de Amazon Elastic Kubernetes Service. Sirve como base para los runbooks que requieren realizar llamadas a la API del plano de control para automatizar tareas y solucionar problemas con un clúster de Amazon EKS.

**importante**  
Todos los recursos creados por esta automatización están etiquetados para que se puedan encontrar fácilmente. Las etiquetas utilizadas son:  
 `AWSSupport-SetupK8sApiProxyForEKS`: true 

**nota**  
La automatización es un manual auxiliar y no se puede ejecutar como un manual independiente. Se invoca como una automatización secundaria para los runbooks que requieren llamadas a la API del plano de control al clúster Amazon EKS.
Asegúrese de ejecutar la `Cleanup` operación después del uso para evitar incurrir en costos no deseados.

**Tipo de documento**

Automatización

**Propietario**

Amazon

**Plataformas**

Linux

**Parámetros**
+ AutomationAssumeRole

  Tipo: cadena

  Descripción: (opcional) el Nombre de recurso de Amazon (ARN) del rol de AWS Identity and Access Management (IAM) que permite a Systems Manager Automation realizar las acciones en su nombre. Si no se especifica ningún rol, Systems Manager Automation utiliza los permisos del usuario que comienza este manual de procedimientos.
+ ClusterName

  Tipo: cadena

  Descripción: (obligatorio) El nombre del clúster de Amazon Elastic Kubernetes Service.
+ Operación

  Tipo: cadena

  Descripción: (Obligatoria) Operación a realizar: `Setup` aprovisiona la función Lambda en la cuenta y desaprovisiona `Cleanup` los recursos creados como parte de la fase de configuración.

  Valores permitidos: \$1 `Setup` `Cleanup`

  Predeterminado: Configuración
+ LambdaRoleArn

  Tipo: cadena

  Descripción: (opcional) El ARN del rol de IAM que permite a la AWS Lambda función acceder a los AWS servicios y recursos necesarios. Si no se especifica ningún rol, Systems Manager Automation creará un rol de IAM para Lambda en su cuenta con el `Automation-K8sProxy-Role-<ExecutionId>` nombre que incluye las políticas `AWSLambdaBasicExecutionRole` administradas: y. `AWSLambdaVPCAccessExecutionRole`

 **¿Cómo funciona?** 

 El manual de ejecución lleva a cabo los siguientes pasos: 
+ Valida que la automatización se esté ejecutando como una ejecución secundaria. El manual de ejecución no funcionará cuando se invoque como un manual independiente, ya que no realiza ningún trabajo significativo por sí solo.
+ Comprueba la CloudFormation pila existente de la función Lambda proxy para el clúster especificado.
  + Si la pila existe, la infraestructura existente se reutiliza en lugar de volver a crearla.
  + Se mantiene un contador de referencias mediante etiquetas para garantizar que un runbook no elimine la infraestructura si otro runbook la reutiliza para el mismo clúster.
+ Realice el tipo de operación (`Setup`/`Cleanup`) especificado para la invocación:
  + **Configuración:** crea o describe los recursos existentes.

    **Limpieza:** elimina los recursos aprovisionados si la infraestructura no está siendo utilizada por ningún otro manual.

 **Permisos de IAM necesarios** 

El `AutomationAssumeRole` parámetro requiere que no se pasen los siguientes permisos` 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` 

Cuando `LambdaRoleArn` se proporciona, la automatización no necesita crear el rol y se pueden excluir los siguientes permisos:
+  `iam:CreateRole` 
+  `iam:DeleteRole` 
+  `iam:TagRole` 
+  `iam:UntagRole` 
+  `iam:AttachRolePolicy` 
+  `iam:DetachRolePolicy` 

A continuación, se muestra un ejemplo de política que demuestra los permisos necesarios ` AutomationAssumeRole` cuando no `LambdaRoleArn` se aprueban:

------
#### [ 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"
        }
    ]
}
```

------

 En caso de que `LambdaRoleArn` se apruebe, asegúrese de que tenga una [ AWSLambdaBasicExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaBasicExecutionRole)política adjunta para los clústeres públicos y, además, [ AWSLambdaVPCAccessExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaVPCAccessExecutionRole)para los clústeres privados. 

 **Recursos creados** 

Los siguientes recursos se crean durante la `Setup` operación:

1. AWS Lambda función

1. Función de IAM: función de ejecución de Lambda, si no se proporciona.

1. CloudWatch Grupo de registros (registros Lambda)

 *La función Lambda y el rol de ejecución se conservan hasta que se ejecute `Cleanup` la operación. El grupo de registros Lambda se conservará durante 30 días o hasta que se elimine manualmente.* 

 **Instrucciones** 

El runbook es una utilidad auxiliar diseñada para ejecutarse desde otros runbooks como una automatización secundaria. Facilita la creación de una infraestructura que permite al runbook principal realizar llamadas a la API del plano de control de Amazon EKS K8. Para utilizar el manual, puede seguir los pasos que se indican a continuación desde el contexto de la automatización principal.

1. **Fase de configuración**: invoque la automatización mediante una operación de ` aws:executeAutomation` acción del manual que desee realizar llamadas a la API del plano de control de Amazon EKS K8 con la operación establecida en. `Setup`

   Ejemplo de parámetros de entrada:

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

   El resultado del `aws:executeAutomation` paso contendrá el ARN de la función Lambda proxy.

1. **Uso del proxy Lambda**: invoca la función Lambda dentro de la `aws:executeScript` acción que utiliza ` Lambda.Client.invoke(...)` con una lista de rutas `boto3` de llamadas a la API y un token de portador. La función Lambda realizará `GET` llamadas HTTP a la ruta especificada pasando el token portador como parte del encabezado de autorización.

   Ejemplo de evento de invocación de Lambda:

   ```
      {
          "ApiCalls": ["/api/v1/pods/", ...],
          "BearerToken": "..."
      }
   ```
**nota**  
El token portador debe generarse como parte del script de automatización principal. Debe asegurarse de que la persona principal que ejecuta el runbook principal tenga permiso de solo lectura para el clúster de Amazon EKS especificado.

1. **Fase de limpieza**: invoque la automatización mediante una operación de ` aws:executeAutomation` acción del manual que desee realizar llamadas a la API del plano de control de Amazon EKS K8 con la operación configurada en. `Cleanup`

   Ejemplo de parámetros de entrada:

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

 **Pasos de automatización** 

1.  **ValidateExecution** 
   + Verifica que la automatización no se ejecute como una ejecución independiente.

1.  **CheckForExistingStack** 
   + Comprueba si ya se ha aprovisionado una CloudFormation pila para el nombre del clúster especificado.
   + Devuelve el estado de existencia de la pila y si es seguro eliminarla.

1.  **BranchOnIsStackExists** 
   + Paso de decisión que se ramifica en función de la existencia de la pila.
   + Rutas para actualizar el nombre de la pila existente o continuar con la ramificación de la operación.

1.  **UpdateStackName** 
   + Actualiza la `StackName` variable con el nombre de la pila existente.
   + Solo se ejecuta si la pila ya existe.

1.  **BranchOnOperation** 
   + Enruta la automatización en función del `Operation` parámetro (`Setup`/`Cleanup`).
   + Para`Setup`: Rutas para crear una nueva pila o describir los recursos existentes.
   + Para`Cleanup`: Procede a eliminar la pila si es seguro eliminarla.

1.  **GetClusterNetworkConfig** 
   + Describe el clúster de Amazon EKS para obtener la configuración de VPC.
   + Recupera datos de punto final, ID de VPC, IDs subred, ID de grupo de seguridad y CA.

1.  **ProvisionResources** 
   + Crea una CloudFormation pila con los recursos necesarios.
   + Aprovisiona la función Lambda con la configuración de red necesaria.
   + Etiqueta todos los recursos para su seguimiento y administración.

1.  **DescribeStackResources** 
   + Recupera información sobre la created/existing pila.
   + Obtiene el ARN de la función Lambda aprovisionada.

1.  **BranchOnIsLambdaDeploymentRequired** 
   + Determina si es necesario implementar código Lambda.
   + Solo se procede al despliegue de las pilas recién creadas.

1.  **DeployLambdaFunctionCode** 
   + Implementa el código de la función Lambda mediante el paquete de despliegue.
   + Actualiza la función con la implementación del proxy.

1.  **AssertLambdaAvailable** 
   + Comprueba que la actualización del código de la función Lambda se ha realizado correctamente.
   + Espera a que la función esté en estado. `Successful`

1.  **PerformStackCleanup** 
   + Elimina la CloudFormation pila y los recursos asociados.
   + Se ejecuta durante la `Cleanup` operación o en caso de fallo de la ` Setup` operación.

 **Salidas** 

*LambdaFunctionArn*: ARN de la función Lambda proxy

**Referencias**

Automatización de Systems Manager
+ [Ejecución de una automatización](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [Configuración de Automatización](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [Flujos de trabajo de automatización de Support](https://aws.amazon.com/premiumsupport/technology/saw/)