AWS環境にてSSL証明書としてLet’s Encryptを利用しており、Let’s Encryptクライアントとしてlegoを使用した場合、legoが動作しているEC2インスタンスからRoute53のPublicレコードを制御可能にさせる必要がある。 EC2に設定するポリシーは以下を参照 legoを動かしているAWSアカウントと別のAWSアカウントで、Route53のPublicレコードを管理している場合に、クロスアカウントアクセスのIAMロールを作成する方法です。 こちらのポリシーをそのまま 作成したロールにポリシーをアタッチ EC2に割り当てるロール アカウントAと同様にこちらのポリシーと、アカウントAに作成したロールのarn情報を設定 legoを動作させるEC2インスタンスにIAMロールを設定後、以下のコマンドでZone情報が取れる事を確認する IAMロール徹底理解 〜 AssumeRoleの正体 | DevelopersIO AssumeRoleを使って他のロールの情報を取得する方法 | ハックノート そもそもDNS認証だと、同一アカウント内にRoute53レコードが必要かも・・ 上記の確認コマンドの様にZoneIDを指定すれば他のアカウントの情報取れるけど、legoコマンド実行するときはドメイン名しか指定しない。 ドメイン名からZoneIDを取得しようとすると、自アカウント内で検索して、ZoneIDがヒットしない気が・・はじめに
前提条件
terraform
アカウントAで作成するIAMロール
aws_iam_role
Principal
には接続元となるlego動作するAWSアカウントを設定resource "aws_iam_role" "letsencrypt-cross-acount-role" {
name = "letsencrypt-cross-acount-role"
path = "/"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<BのAWSアカウントID>:root"
},
"Action": "sts:AssumeRole",
"Condition": {
}
}
]
}
POLICY
}
aws_iam_policy_document
data "aws_iam_policy_document" "letsencrypt-cross-acount-policy" {
statement {
effect = "Allow"
actions = [
"route53:GetChange",
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets",
]
resources = [
"arn:aws:route53:::hostedzone/*",
"arn:aws:route53:::change/*"
]
}
statement {
effect = "Allow"
actions = [
"route53:ListHostedZonesByName",
]
resources = [
"*"
]
}
}
aws_iam_role_policy
resource "aws_iam_role_policy" "letsencrypt-cross-acount-policy" {
name = "letsencrypt-cross-acount-policy"
role = "${aws_iam_role.letsencrypt-cross-acount-role.id}"
policy = "${data.aws_iam_policy_document.letsencrypt-cross-acount-policy.json}"
}
アカウントBで作成するIAMロール
aws_iam_role
resource "aws_iam_role" "iam_role_instance" {
name = "iam_role_instance"
path = "/"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
resource "aws_iam_instance_profile" "iam_instance_profile" {
name = "instance-role"
role = "${aws_iam_role.iam_role_instance.name}"
}
aws_iam_policy_document
data "aws_iam_policy_document" "letsencrypt-cert-policy" {
statement {
effect = "Allow"
actions = [
"route53:GetChange",
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets",
]
resources = [
"arn:aws:route53:::hostedzone/*",
"arn:aws:route53:::change/*"
]
}
statement {
effect = "Allow"
actions = [
"route53:ListHostedZonesByName",
]
resources = [
"*"
]
}
statement {
effect = "Allow"
actions = [
"sts:AssumeRole",
]
resources = [
"arn:aws:iam::<AのAWSアカウントID>:role/letsencrypt-cross-acount-role"
]
}
}
aws_iam_role_policy
resource "aws_iam_role_policy" "instance_role_policy" {
name = "instance_role_policy"
role = "${aws_iam_role.iam_role_instance.id}"
policy = "${data.aws_iam_policy_document.letsencrypt-cert-policy.json}"
}
動作確認
aws route53 list-hosted-zones-by-name --hosted-zone-id <Zone ID>
参考
追記
$ aws route53 list-hosted-zones-by-name --dns-name <FQDN>
{ "HostedZones": [],
"DNSName": "<FQDN>",
"IsTruncated": false,
"MaxItems": "100"
}