dehio3’s diary

仕事、生活、趣味のメモ

terraformでELBを作ろうとすると「Error creating network Load Balancer: AccessDenied」が出力される

事象

一度もELBを作成したことないAWSアカウントで、terraformでELBを作成しようとすると以下のエラーが発生

Error: Error applying plan:

2 error(s) occurred:

* aws_lb.ldap: 1 error(s) occurred:

* aws_lb.ldap: Error creating network Load Balancer: AccessDenied: User: arn:aws:iam::<AWSアカウントID>:user/<terraform実行ユーザー名> is not authorized to perform: ec2:DescribeAccountAttributes
    status code: 403, request id: 8a26539e-3fec-11e9-a36b-f7e2da198215
* aws_lb_target_group.ldap: 1 error(s) occurred:

* aws_lb_target_group.ldap: Error creating LB Target Group: AccessDenied: User: arn:aws:iam::<AWSアカウントID>:user/<terraform実行ユーザー名> is not authorized to perform: ec2:DescribeVpcs
    status code: 403, request id: 8a2653ec-3fec-11e9-b713-837b3c8bf324

原因

AWSコンソールから手動で作成した場合に自動で作成されるサービスロール(AWSServiceRoleForElasticLoadBalancing)がない

対応

サービスロールの作成を追加

resource "aws_iam_service_linked_role" "AWSServiceRoleForElasticLoadBalancing" {
  aws_service_name = "elasticloadbalancing.amazonaws.com"
}

ただし、ELBのリソース作成前に作成されている必要があるらしく、追加後の初回は同じエラーでこける。
サービスロールが作成後は処理が進むので、前後条件を指定するのが綺麗です。

depends_on = ["aws_iam_service_linked_role.AWSServiceRoleForElasticLoadBalancing"]