Account Factory for Terraform (AFT)のパイプラインを久しぶりに実行したらエラーになったから復旧させてみた([ERROR] IndexError: list index out of range Traceback)

2024.03.04

AFTを使って既存のアカウントに対して、カスタマイズを実行する機会がありました。

AFTのバージョンの関係で少しハマるところがあったので、ブログにします。

作業内容は以下のブログが分かりやすいです。

Account Factory for Terraform (AFT) で AWSアカウントのカスタマイズを試してみた | DevelopersIO

1.アカウントカスタムリポジトリにコードを追加 2.リクエストリポジトリにパラメータを追加 3.手動でStep Functionsステートマシンを実行

環境情報

  • AFT: 1.9.2

エラー1: カスタマイズパイプライン実行用のStepFunctionsでエラーがでる

「3.手動でStep Functionsステートマシンを実行」この手順を実施した際に、Step Functionsaft-invoke-customizationsが失敗しました。

詳しく見てみると、Lambda関数aft-customizations-execute-pipelineが失敗したようです。

[ERROR] IndexError: list index out of range Traceback (most recent call last): File "/var/task/aft_customizations_execute_pipeline.py", line 37, in lambda_handler

途方にくれながら調べていたら、以下のIssueがありました。

Issues running aft-customizations-execute-pipeline as part of aft-invoke-customizations step function · Issue #404 · aws-ia/terraform-aws-control_tower_account_factory

AFT v1.11以前では、最後の実行から1 年以上実行されていないカスタマイズパイプラインを実行する際にStep Functionsステートマシンaft-invoke-customizationsが実行されると、Lambda関数aft-customizations-execute-pipelineはトレースバックを生成してLambda関数が失敗するようです。

v1.11以降にAFTをバージョンアップすれば解消するようです。

作業時点では、v1.12が最新だったため、v1.12へアップデートすることにしました。

エラー2: Cycleエラー

v1.12へのアップデートも少し苦戦しました。以下のようにバージョンを変更します。

main.tf

module "aft" {
  source = "aws-ia/control_tower_account_factory/aws"
-  version = "1.9.2"
+  version = "1.12.0"
...
$ terraform init -upgrade

必要に応じて、AWS Providerのバージョンアップも行います。

バージョンアップが終わったらPlanを実行します。

$ terraform plan

Cycleエラーが起きています。

│ Error: Cycle: module.aft.module.aft_feature_options.aws_lambda_function.aft_enroll_support (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_enroll_support, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_invoke_aft_account_provisioning_framework (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_invoke_aft_account_provisioning_framework, module.aft.module.aft_customizations.aws_sfn_state_machine.aft_invoke_customizations_sfn (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_identify_targets, module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_execute_pipeline (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_identify_targets (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_get_pipeline_executions (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_get_pipeline_executions, module.aft.module.aft_customizations.local.replacements_map (expand), module.aft.module.aft_customizations.aws_sfn_state_machine.aft_invoke_customizations_sfn, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_processor (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_processor, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_controltower_event_logger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_controltower_event_logger, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_audit_trigger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_audit_trigger, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_action_trigger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_action_trigger, module.aft.module.aft_feature_options.aws_lambda_function.aft_enable_cloudtrail (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_enable_cloudtrail, module.aft.module.aft_customizations.aws_iam_role_policy.aft_invoke_customizations_sfn (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.tag_account, module.aft.module.aft_account_provisioning_framework.aws_lambda_function.tag_account (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.create_role, module.aft.module.aft_account_provisioning_framework.aws_lambda_function.create_role (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.persist_metadata (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.persist_metadata, module.aft.module.aft_account_provisioning_framework.local.replacements_map (expand), module.aft.module.aft_account_provisioning_framework.aws_sfn_state_machine.aft_account_provisioning_framework_sfn (expand), module.aft.module.aft_account_provisioning_framework.output.state_machine_arn (expand), module.aft.module.aft_customizations.var.invoke_account_provisioning_sfn_arn (expand), module.aft.module.aft_customizations.aws_iam_role_policy.aft_invoke_customizations_sfn, module.aft.module.aft_account_request_framework.var.aft_common_layer_arn (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_cleanup_resources (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_cleanup_resources, module.aft.module.aft_account_provisioning_framework.var.aft_common_layer_arn (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.account_metadata_ssm (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.account_metadata_ssm, module.aft.module.aft_feature_options.aws_lambda_function.aft_delete_default_vpc (expand), module.aft.module.aft_feature_options.var.aft_common_layer_arn (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_delete_default_vpc, module.aft.module.aft_lambda_layer.aws_lambda_layer_version.layer_version (destroy deposed f43ae6d4), module.aft.module.aft_lambda_layer.aws_lambda_function.codebuild_invoker (destroy), module.aft.module.aft_lambda_layer.aws_lambda_layer_version.layer_version, module.aft.module.aft_lambda_layer.output.layer_version_arn (expand), module.aft.module.aft_customizations.var.aft_common_layer_arn (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_execute_pipeline

1.9.2から1.12.0で変更が多かったためか、リソースの置き換えが上手くいっていない様子です。

1.12.0に一気に上げるのは諦めて、一つ前の1.11.1を挟んでみましょう。

アップデートの手順は同じです。再度、planすると今度はCycleエラーがでませんでした。

$ terraform plan
# 省略
Plan: 2 to add, 26 to change, 5 to destroy.

applyまで実行します。

$ terraform apply

applyが成功したら、今度は1.12.0に上げます。手順は同様です。

$ terraform plan
# 省略
Plan: 8 to add, 21 to change, 5 to destroy.

applyが成功することを確認できるはずです。

ここまで来たら、1つ目のStep Functionsのエラーは解消しているはずです。

再度「3.手動でStep Functionsステートマシンを実行」を試して、Step Functionsの実行が成功することを確認できました。

該当のパイプラインも正常に実行されました。

おわりに

「エラー2 Cycleエラー」に関しては、もう少し深堀りたかったですが大変そうだったので、とりあえず解決策だけ書きました。

手動でうまい具合にリソース消して上げれば、もしかしたら一気にバージョン上げれるかもしれません。

大変だと思うので、バージョン少し刻んで上げることをおすすめします。

以上、AWS事業本部の佐藤(@chari7311)でした。