

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

 **説明** 

**AWSSupport-SetupK8sApiProxyForEKS** オートメーションランブックは、Amazon Elastic Kubernetes Service クラスターエンドポイントへのコントロールプレーン API コールを行うためのプロキシとして機能する AWS Lambda 関数を作成する方法を提供します。これは、Amazon EKS クラスターのタスクを自動化し、問題をトラブルシューティングするためにコントロールプレーン API コールを行う必要があるランブックの構成要素として機能します。

**重要**  
この自動化によって作成されたすべてのリソースにはタグが付けられ、簡単に見つけることができます。使用されるタグは次のとおりです。  
 `AWSSupport-SetupK8sApiProxyForEKS`: true 

**注記**  
オートメーションはヘルパーランブックであり、スタンドアロンランブックとして実行することはできません。これは、Amazon EKS クラスターへのコントロールプレーン API コールを必要とするランブックの子オートメーションとして呼び出されます。
不要なコストが発生しないように、使用後は必ず`Cleanup`オペレーションを実行してください。

**ドキュメントタイプ**

オートメーション

**[所有者]**

Amazon

**[Platforms]** (プラットフォーム)

Linux

**パラメータ**
+ AutomationAssumeRole

  タイプ: 文字列

  説明: (オプション) Systems Manager Automation がユーザーに代わってアクションを実行できるようにする AWS Identity and Access Management (IAM) ロールの Amazon リソースネーム (ARN)。ロールを指定しない場合、Systems Manager Automation はこのランブックを開始するユーザーのアクセス許可を使用します。
+ ClusterName

  タイプ: 文字列

  説明: (必須) Amazon Elastic Kubernetes Service クラスターの名前。
+ 運用

  タイプ: 文字列

  説明: (必須) 実行するオペレーション: アカウントで Lambda 関数を`Setup`プロビジョニングし、セットアップフェーズの一部として作成されたリソースのプロビジョニングを解除`Cleanup`します。

  使用できる値: `Setup` \$1 `Cleanup`

  デフォルト: セットアップ
+ LambdaRoleArn

  タイプ: 文字列

  説明: (オプション) 関数が必要な AWS サービスとリソースにアクセスできるようにする AWS Lambda IAM ロールの ARN。ロールが指定されていない場合、この Systems Manager Automation は、管理ポリシー `Automation-K8sProxy-Role-<ExecutionId>` `AWSLambdaBasicExecutionRole`と を含む名前で、アカウントに Lambda の IAM ロールを 1 つ作成します`AWSLambdaVPCAccessExecutionRole`。

 **動作の仕組み** 

 ランブックは次のステップを実行します。
+ オートメーションが子実行として実行されていることを確認します。ランブックは、スタンドアロンランブックとして呼び出されると機能しません。これは、ランブックが単独で意味のある作業を実行しないためです。
+ 指定されたクラスターのプロキシ Lambda 関数の既存の CloudFormation スタックをチェックします。
  + スタックが存在する場合、既存のインフラストラクチャは再作成する代わりに再利用されます。
  + リファレンスカウンターは、同じクラスターの別のランブックによって再利用されている場合、ランブックがインフラストラクチャを削除しないようにタグを使用して維持されます。
+ 呼び出しに指定されたオペレーションタイプ (`Setup`/`Cleanup`) を実行します。
  + **セットアップ:** 既存のリソースを作成または記述します。

    **クリーンアップ:** インフラストラクチャが他のランブックで使用されていない場合、プロビジョニングされたリソースを削除します。

 **必要な 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"
        }
    ]
}
```

------

 が渡された場合`LambdaRoleArn`は、パブリッククラスター用に [ AWSLambdaBasicExecutionRole ](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2Fservice-role%2FAWSLambdaBasicExecutionRole) ポリシーがアタッチされていること、さらにプライベートクラスター用に [ 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 ログ)

 *Lambda 関数と実行ロールは、`Cleanup`オペレーションが実行されるまで保持されます。Lambda ロググループは 30 日間、または手動で削除されるまで保持されます。*

 **指示** 

ランブックは、子オートメーションとして他のランブック内から実行されるように設計されたヘルパーユーティリティです。これにより、親ランブックが Amazon EKS K8s コントロールプレーン API コールを実行できるようにするインフラストラクチャの作成が容易になります。ランブックを使用するには、親オートメーションのコンテキストから以下のステップに従います。

1. **セットアップフェーズ**: オペレーションを に設定して Amazon EKS K8s コントロールプレーン API コールを行うランブックから` aws:executeAutomation`アクションオペレーションを使用してオートメーションを呼び出します`Setup`。

   入力パラメータの例:

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

   `aws:executeAutomation` ステップの出力には、プロキシ Lambda 関数の ARN が含まれます。

1. **Lambda プロキシの使用**: API コールパスとベアラートークンのリスト` Lambda.Client.invoke(...)`を含む `boto3`の を使用して、`aws:executeScript`アクション内で Lambda 関数を呼び出します。Lambda 関数は、ベアラートークンを認可ヘッダーの一部として渡すことで、指定されたパスへの HTTP `GET`呼び出しを実行します。

   Lambda 呼び出しイベントの例:

   ```
      {
          "ApiCalls": ["/api/v1/pods/", ...],
          "BearerToken": "..."
      }
   ```
**注記**  
ベアラートークンは、親オートメーションスクリプトの一部として生成する必要があります。親ランブックを実行するプリンシパルに、指定された Amazon EKS クラスターへの読み取り専用アクセス許可があることを確認する必要があります。

1. **クリーンアップフェーズ**: オペレーションを に設定して Amazon EKS K8s コントロールプレーン API コールを行うランブックから` aws:executeAutomation`アクションオペレーションを使用してオートメーションを呼び出します`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`。
   + の場合`Setup`: 新しいスタックを作成するか、既存のリソースを記述するようにルーティングします。
   + の場合`Cleanup`: 安全に削除できる場合、スタックの削除に進みます。

1.  **GetClusterNetworkConfig** 
   + VPC 設定を取得するための Amazon EKS クラスターについて説明します。
   + エンドポイント、VPC ID、サブネット IDs、セキュリティグループ ID、CA データを取得します。

1.  **ProvisionResources** 
   + 必要なリソースを持つ CloudFormation スタックを作成します。
   + 必要なネットワーク設定で Lambda 関数をプロビジョニングします。
   + 追跡と管理のためにすべてのリソースにタグを付けます。

1.  **DescribeStackResources** 
   + 作成済み/既存のスタックに関する情報を取得します。
   + プロビジョニングされた 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)
+ [自動化ワークフローのサポート](https://aws.amazon.com/premiumsupport/technology/saw/)