

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

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

 **Description** 

Le manuel d'automatisation de **AWSSupport-SetupK8 sApiProxy ForeKS** fournit un moyen de créer une AWS Lambda fonction qui agit comme un proxy pour effectuer des appels d'API du plan de contrôle vers le point de terminaison du cluster Amazon Elastic Kubernetes Service. Il sert de base aux runbooks qui nécessitent des appels d'API du plan de contrôle pour automatiser les tâches et résoudre les problèmes liés à un cluster Amazon EKS.

**Important**  
Toutes les ressources créées par cette automatisation sont étiquetées afin de pouvoir être facilement trouvées. Les balises utilisées sont les suivantes :  
 `AWSSupport-SetupK8sApiProxyForEKS` : true 

**Note**  
L'automatisation est un runbook auxiliaire et ne peut pas être exécuté en tant que runbook autonome. Il est invoqué en tant qu'automatisation secondaire pour les runbooks qui nécessitent des appels d'API du plan de contrôle vers le cluster Amazon EKS.
Assurez-vous de fonctionner après `Cleanup` utilisation pour éviter d'encourir des coûts indésirables.

**Type de document**

 Automatisation

**Propriétaire**

Amazon

**Plateformes**

Linux

**Paramètres**
+ AutomationAssumeRole

  Type : Chaîne

  Description : (Facultatif) Le nom de ressource Amazon (ARN) du rôle Gestion des identités et des accès AWS (IAM) qui permet à Systems Manager Automation d'effectuer les actions en votre nom. Si aucun rôle n'est spécifié, Systems Manager Automation utilise les autorisations de l'utilisateur qui lance ce runbook.
+ ClusterName

  Type : Chaîne

  Description : (Obligatoire) Nom du cluster Amazon Elastic Kubernetes Service.
+ Opération

  Type : Chaîne

  Description : (Obligatoire) Opération à effectuer : `Setup` provisionne la fonction Lambda dans le compte, `Cleanup` désapprovisionnera les ressources créées dans le cadre de la phase de configuration.

  Valeurs autorisées : `Setup` \$1 `Cleanup`

  Par défaut : Configuration
+ LambdaRoleArn

  Type : Chaîne

  Description : (Facultatif) L'ARN du rôle IAM qui permet à la AWS Lambda fonction d'accéder aux AWS services et ressources requis. Si aucun rôle n'est spécifié, cette automatisation de Systems Manager créera un rôle IAM pour Lambda dans votre compte avec le `Automation-K8sProxy-Role-<ExecutionId>` nom qui inclut les politiques `AWSLambdaBasicExecutionRole` gérées : et. `AWSLambdaVPCAccessExecutionRole`

 **Fonctionnement** 

 Le runbook exécute les étapes suivantes : 
+ Valide que l'automatisation s'exécute en tant qu'exécution secondaire. Le runbook ne fonctionnera pas lorsqu'il est invoqué en tant que runbook autonome car il n'effectue aucun travail significatif à lui seul.
+ Vérifie la CloudFormation pile existante pour la fonction Lambda du proxy pour le cluster spécifié.
  + Si la pile existe, l'infrastructure existante est réutilisée au lieu de la recréer.
  + Un compteur de références est maintenu à l'aide de balises pour garantir qu'un runbook ne supprime pas l'infrastructure si elle est réutilisée par un autre runbook pour le même cluster.
+ Exécutez le type d'opération (`Setup`/`Cleanup`) spécifié pour l'invocation :
  + **Configuration :** crée ou décrit des ressources existantes.

    **Nettoyage :** Supprime les ressources provisionnées si l'infrastructure n'est utilisée par aucun autre runbook.

 **Autorisations IAM nécessaires** 

Le `AutomationAssumeRole` paramètre nécessite que les autorisations suivantes ne ` LambdaRoleArn` soient pas transmises :
+  `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` 

Lorsqu'elle `LambdaRoleArn` est fournie, l'automatisation n'a pas besoin de créer le rôle et les autorisations suivantes peuvent être exclues :
+  `iam:CreateRole` 
+  `iam:DeleteRole` 
+  `iam:TagRole` 
+  `iam:UntagRole` 
+  `iam:AttachRolePolicy` 
+  `iam:DetachRolePolicy` 

Vous trouverez ci-dessous un exemple de politique illustrant les autorisations requises ` AutomationAssumeRole` lorsque celles-ci ne `LambdaRoleArn` sont pas transmises :

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

------

 Si le protocole `LambdaRoleArn` est adopté, veuillez vous assurer qu'il est assorti d'une [ AWSLambdaBasicExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaBasicExecutionRole)politique pour les clusters publics et, en outre, [ AWSLambdaVPCAccessExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaVPCAccessExecutionRole)pour les clusters privés. 

 **Ressources créées** 

Les ressources suivantes sont créées pendant le `Setup` fonctionnement :

1. AWS Lambda fonction

1. Rôle IAM : rôle d'exécution Lambda, s'il n'est pas fourni.

1. CloudWatch Groupe de journaux (journaux Lambda)

 *La fonction Lambda et le rôle d'exécution sont conservés jusqu'à ce que `Cleanup` l'opération soit exécutée. Le groupe de journaux Lambda sera conservé pendant 30 jours ou jusqu'à sa suppression manuelle.* 

 **Instructions** 

Le runbook est un utilitaire d'assistance conçu pour être exécuté à partir d'autres runbooks en tant qu'automatisation secondaire. Il facilite la création d'une infrastructure permettant au runbook parent de passer des appels d'API du plan de contrôle Amazon EKS K8s. Pour utiliser le runbook, vous pouvez suivre les étapes ci-dessous dans le contexte de l'automatisation parent.

1. **Phase de configuration** : lancez l'automatisation à l'aide ` aws:executeAutomation` d'une opération d'action depuis le runbook qui souhaite effectuer des appels d'API du plan de contrôle Amazon EKS K8 avec l'opération définie sur. `Setup`

   Exemple de paramètres d'entrée :

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

   La sortie de l'`aws:executeAutomation`étape contiendra l'ARN de la fonction Lambda du proxy.

1. **Utilisation du proxy Lambda** : invoquez la fonction Lambda dans l'`aws:executeScript`action à l'aide d'une liste `boto3` de chemins d'appel ` Lambda.Client.invoke(...)` d'API et d'un jeton porteur. La fonction Lambda effectuera des `GET` appels HTTP vers le chemin spécifié en transmettant le jeton porteur dans l'en-tête d'autorisation.

   Exemple d'événement d'appel Lambda :

   ```
      {
          "ApiCalls": ["/api/v1/pods/", ...],
          "BearerToken": "..."
      }
   ```
**Note**  
Le jeton porteur doit être généré dans le cadre du script d'automatisation parent. Vous devez vous assurer que le principal exécutant le runbook parent dispose d'une autorisation en lecture seule sur le cluster Amazon EKS spécifié.

1. **Phase de nettoyage : lancez** l'automatisation à l'aide ` aws:executeAutomation` d'une opération d'action depuis le runbook qui souhaite effectuer des appels d'API du plan de contrôle Amazon EKS K8 avec l'opération définie sur. `Cleanup`

   Exemple de paramètres d'entrée :

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

 **Étapes d'automatisation** 

1.  **ValidateExecution** 
   + Vérifie que l'automatisation ne s'exécute pas en tant qu'exécution autonome.

1.  **CheckForExistingStack** 
   + Vérifie si une CloudFormation pile a déjà été provisionnée pour le nom de cluster spécifié.
   + Renvoie le statut d'existence de la pile et indique si elle peut être supprimée en toute sécurité.

1.  **BranchOnIsStackExists** 
   + Étape de décision qui se ramifie en fonction de l'existence de la pile.
   + Itinéraires permettant soit de mettre à jour le nom de la pile existante, soit de procéder au branchement des opérations.

1.  **UpdateStackName** 
   + Met à jour la `StackName` variable avec le nom de la pile existante.
   + Exécuté uniquement si la pile existe déjà.

1.  **BranchOnOperation** 
   + Achemine l'automatisation en fonction du `Operation` paramètre (`Setup`/`Cleanup`).
   + Pour `Setup` : itinéraires permettant de créer une nouvelle pile ou de décrire des ressources existantes.
   + Pour `Cleanup` : procède à la suppression par pile si la suppression peut être effectuée en toute sécurité.

1.  **GetClusterNetworkConfig** 
   + Décrit le cluster Amazon EKS permettant d'obtenir la configuration VPC.
   + Récupère le point de terminaison, l'ID VPC, le IDs sous-réseau, l'ID du groupe de sécurité et les données de l'autorité de certification.

1.  **ProvisionResources** 
   + Crée une CloudFormation pile avec les ressources requises.
   + Fournit la fonction Lambda avec la configuration réseau nécessaire.
   + Balise toutes les ressources à des fins de suivi et de gestion.

1.  **DescribeStackResources** 
   + Récupère des informations sur la created/existing pile.
   + Obtient l'ARN de la fonction Lambda provisionnée.

1.  **BranchOnIsLambdaDeploymentRequired** 
   + Détermine si le déploiement du code Lambda est nécessaire.
   + Procède au déploiement uniquement pour les piles nouvellement créées.

1.  **DeployLambdaFunctionCode** 
   + Déploie le code de fonction Lambda à l'aide du package de déploiement.
   + Met à jour la fonction avec l'implémentation du proxy.

1.  **AssertLambdaAvailable** 
   + Vérifie que la mise à jour du code de fonction Lambda a réussi.
   + Attend que la fonction soit active`Successful`.

1.  **PerformStackCleanup** 
   + Supprime la CloudFormation pile et les ressources associées.
   + Exécuté en cours de `Cleanup` fonctionnement ou en cas d'échec de ` Setup` fonctionnement.

 **Sorties** 

*LambdaFunctionArn*: ARN de la fonction Lambda du proxy

**Références**

Systems Manager Automation
+ [Exécuter une automatisation](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [Configuration d'une automatisation](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [Support des flux de travail automatisés](https://aws.amazon.com/premiumsupport/technology/saw/)