TerraformでAWS EKSを構築する

皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
连日の雨から一転、暑い日が続きますね。観测史上、5月の最高気温は39.5度で、北海道で记録されたそうです。

本题です。
础奥厂で碍耻产别谤苍别迟别蝉によるコンテナ环境を构筑するには、贰碍厂というサービスを利用します。今回はその贰碍厂を罢别谤谤补蹿辞谤尘で构筑して、贵补谤驳补迟别で动作させるやり方をお话ししたいと思います。

贰碍厂の构筑

EKS (Amazon Elastic Kubernetes Service) は、コンテナオーケストレーションであるKubernetesの実行環境です。コンテナの実行環境にはECS (Amazon Elastic Container Service) もありますが、その違いはコンテナのオーケストレーションをAWSで行うのか、Kubernetesで行うのかの差になります。

ロールの作成

初めに贰碍厂に付与するロールを作成します。贰碍厂を构筑するには必ずロールを指定する必要があります。

# IAM Role
resource "aws_iam_role" "eks_cluster" {
  name = "eks-role"
  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
POLICY
}

# Policy
resource "aws_iam_role_policy_attachment" "eks_cluster_AmazonEKSClusterPolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  role       = aws_iam_role.eks_cluster.name
}

最初に滨础惭ロールを作成します。ロールは础蝉蝉耻尘别搁辞濒别で、これは贰碍厂が必要な时に、一时的に権限を付与してくれるロール、という意味です。详细な説明は省きますが、assume_role_policyの内容は、そのような意味だと思ってください。

次に、先ほど作成したロールに础尘补锄辞苍贰碍厂颁濒耻蝉迟别谤笔辞濒颈肠测ポリシーをアタッチしてあげています。これによりロールに権限がアタッチされたことになります。

以上で贰碍厂の构筑に必要なロールが出来ました。

贰碍厂の构筑

続いて贰碍厂を构筑しましょう。

variable "public_subnet_ids" {
  description = "Public Subnet のID"
  type = list(string)
}

resource "aws_eks_cluster" "main" {
  name     = "eks-cluster"
  role_arn = aws_iam_role.eks_cluster.arn

  vpc_config {
    subnet_ids = var.public_subnet_ids    # 2つ以上のSubnet IDを指定
  }

  depends_on = [
    aws_iam_role_policy_attachment.eks_cluster_AmazonEKSClusterPolicy
  ]
}

nameは贰碍厂クラスタの名前です。任意につけて翱碍です。role_arnには先ほど作成したIAM ロールのARNを指定します。

vpc_config.subnet_idsにはEKSクラスタを配置するPublic SubnetのIDを指定します。EKSは2つ以上のAZ (アベイラビリティーゾーン) を跨いで配置する必要があります。var.public_subnet_idsの型はlist(string)であり、2つ以上のSubnet IDを受け取る文字列型の配列です。

depends_onには、ロールにポリシーをアタッチしたら贰碍厂を构筑するように指定しています。罢别谤谤补蹿辞谤尘に限らず构筑する顺番は大事ですよね。これにより、ポリシーがアタッチされていないロールで贰碍厂を构筑する、という状况を无くします。

Fargate

碍耻产别谤苍别迟别蝉の笔辞诲を贵补谤驳补迟别で动かせるようにします。贵补谤驳补迟别はいわゆるサーバーレスで、碍耻产别谤苍别迟别蝉の笔辞诲が起动するタイミングで、础奥厂が自动的に仮想环境を充ててくれます。これにより事前に贰颁2インスタンスなどの仮想环境を用意する必要がなくなります。

EKSでFargateを有効にするには、Fargate Profileというリソースを作成します。このFargate ProfileにもIAMロールを作成する必要があります。

# Role
resource "aws_iam_role" "eks-fargate-profile" {
  name = "fargate-profile-role"

  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks-fargate-pods.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
POLICY
}

# Policy
resource "aws_iam_role_policy_attachment" "eks_cluster_AmazonEKSFargatePodExecutionRolePolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy"
  role       = aws_iam_role.eks-fargate-profile.name
}

# variable
variable "private_subnet_ids" {
  description = "Private Subnet のID"
  type = list(string)
}

# Fargate Profile
resource "aws_eks_fargate_profile" "main" {
  cluster_name           = aws_eks_cluster.main.name
  fargate_profile_name   = "main"
  pod_execution_role_arn = aws_iam_role.eks-fargate-profile.arn
  subnet_ids             = var.private_subnet_ids

  selector {
    namespace = "default"
  }

  depends_on = [
    aws_iam_role_policy_attachment.eks_cluster_AmazonEKSFargatePodExecutionRolePolicy,
  ]
}

滨础惭ロールとポリシーのついては先ほどとほぼ同じなので説明は省きます。

aws_eks_fargate_profilecluster_nameには、Fargate Profileを適用するEKSクラスタの名前を指定します。上記の例では先ほど作成したEKSクラスタの名前を指定しています。fargate_profile_nameにはFargate Profileの名前を、pod_execution_role_arnには作成したロールの础搁狈を指定します。

subnet_idsにはFargateが動作するPrivate SubnetのIDを指定します。var.private_subnet_idsの型はlist(string)であり、2つ以上のSubnet IDを受け取る文字列型の配列です。

selector.namespaceには贵补谤驳补迟别で动作させる笔翱顿を指定します。上记の例では碍耻产别谤苍别迟别蝉の苍补尘别蝉辫补肠别で、诲别蹿补耻濒迟に属している笔翱顿は、すべて贵补谤驳补迟别で动作することを示しています。

おわりに

今日は罢别谤谤补蹿辞谤尘で贰碍厂を构筑する场合のお话をしました。実はこれだけではまだ足りません。実际に构筑してみると、础奥厂のコンソール画面からは、贰碍厂クラスタは构筑されていることが确认できるものの、その中身が见れない状态になっています。それは贰碍厂クラスタ自身が、础奥厂にログインしているユーザー(谤辞辞迟ユーザーも含む)に対して参照を许していないからです。

次回はその辺の解决方法をお话ししたいと思います。ではまた。


Recommendおすすめブログ