HCP Terraform AgentとTerraform EnterpriseがArmアーキテクチャをサポートしました
HCP Terraform AgentとTerraform EnterpriseがArmアーキテクチャをサポートしました。
アップデート概要
HCP Terraform Agentは、HCP Terraformの機能です。
これを使うことで、ユーザー管理のオンプレやEC2等でTerraformの実行を行うことが可能です。
SaaS製品であるHCP Terraformのセルフホスト版として、Terraform Enterpriseがあります。
HCP Terraform AgentやTerraform Enterpriseはその特性から、ユーザー自身がサーバーを用意してインストールする必要があります。
CPUアーキテクチャは以前はx86のみ対応していましたが、今回のアップデートでArmをサポートしました。
ArmベースのAWS Gravitonインスタンス等を利用できるようになり、インフラコストを最適化できます。(同等のx86ベースのAmazon EC2インスタンスよりも最大20%程度低コスト)
やってみた
ArmベースのAmazon EC2 T4gインスタンスにHCP Terraform Agentをインストールしてみます。
基本的には前述のブログの手順と同じです。
EC2インスタンス・HCP Terraform Agentプールの準備
コードの全体は以下をご確認ください。
terraform-sample/hcp-tf-agent-ec2-arm at main · msato0731/terraform-sample · GitHub
ブログ上では、EC2とHCP Terraform Agentプール部分を紹介します。
前述のブログと異なるのは、EC2インスタンスタイプがArmベースのt4gになっている点です。
それに伴い、AMIもArm対応のものに変更しています。
locals {
name = "hcp-tf-agent"
region = "ap-northeast-1"
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = local.name
cidr = "10.0.0.0/16"
azs = ["ap-northeast-1a", "ap-northeast-1c"]
public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
enable_nat_gateway = false
}
data "aws_ssm_parameter" "amazonlinux_2023" {
name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-arm64"
}
resource "aws_instance" "hcp_tf_agent" {
ami = data.aws_ssm_parameter.amazonlinux_2023.value
associate_public_ip_address = true
vpc_security_group_ids = [aws_security_group.hcp_tf_agent.id]
instance_type = "t4g.small"
subnet_id = module.vpc.public_subnets[0]
iam_instance_profile = aws_iam_instance_profile.ssm_profile.name
tags = {
Name = local.name
}
}
resource "aws_iam_role" "ssm_role" {
name = "${local.name}-ssm-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "ssm_managed" {
role = aws_iam_role.ssm_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_instance_profile" "ssm_profile" {
name = "${local.name}-ssm-profile"
role = aws_iam_role.ssm_role.name
}
resource "aws_security_group" "hcp_tf_agent" {
name = local.name
description = local.name
vpc_id = module.vpc.vpc_id
}
resource "aws_vpc_security_group_egress_rule" "allow_all_outbound" {
security_group_id = aws_security_group.hcp_tf_agent.id
ip_protocol = "-1"
cidr_ipv4 = "0.0.0.0/0"
}
resource "tfe_agent_pool" "this" {
name = "sato-blog-test-arm"
organization = var.hcp_tf_organization_name
organization_scoped = true
}
resource "tfe_agent_token" "this" {
agent_pool_id = tfe_agent_pool.this.id
description = "sato-blog-test-arm"
}
EC2インスタンスにHCP Terraform Agentをインストール・tfc-agentをSystemdに登録
前述のブログと異なるのは、バイナリインストールの部分です。
arm64のバイナリをインストールしてください。
確認したところ、1.22.4以降にはArmのバイナリも用意されていました。
Tfc-Agent Versions | HashiCorp Releases
wget https://releases.hashicorp.com/tfc-agent/1.23.2/tfc-agent_1.23.2_linux_arm64.zip
unzip tfc-agent_1.23.2_linux_arm64.zip
動作確認
WorkspaceのExecution ModeをAgentに変更します。
今回作成したAgent Poolを指定します。
planやapplyをして、HCP Terraform上からRunが正常に完了することを確認できました。
EC2上でログを見たい場合は、以下のコマンドで確認できます。
sudo journalctl -xu tfc-agent -f
おわりに
HCP Terraform Agentの利用時には、Agent用のEC2インスタンス等のランニングコストが課題になることがあると思います。(利用規模が拡大すると特に)
今回Armに対応したことで、コスト最適化の選択肢が増えたことは嬉しいですね。