- Terraform管理とLambrollの併用
- Lambrollとは?
- API Gatewayとの連携課題
- data.aws_resourcegroupstaggingapi_resources
- なお
Terraform管理とLambrollの併用
AWSリソースはTerraformで管理しています。Terraformは非常に便利で、無駄に抽象化されていない「素のまま」な使い心地が気に入っています。また、リソースの破棄や再構築も簡単で扱いやすい。
一方で、Lambda関数をTerraformで管理するのは少々面倒に感じます。その理由は、インフラ管理ツールとしてのTerraformと、アプリケーション開発としてのLambda関数では、管理すべきライフサイクルが異なるからです。
Lambda関数は、インフラというよりはアプリケーションの一部です。そのため、インフラの管理フローに組み込むより、アプリケーション開発のフローに適した方法で管理したいと考えました。 以前はServerless Frameworkなどを使っていましたが、最近はさらに軽量なlambrollを使っています。
Lambrollとは?
Lambrollは、AWS Lambda関数を簡単かつ効率的に管理できるコマンドラインツールです。YAMLファイルを使用して、関数の設定や環境変数、IAMロールを一元管理できます。また、コードのデプロイや更新、ロールバックも非常にスムーズに行えます。
API Gatewayとの連携課題
LambrollでLambda関数を管理していると、API GatewayのようにLambda関数と密接に関連するリソースとの連携が課題になります。例えば、APIセットを変更する際には、それに応じてLambda関数の増減が発生します。
Lambda関数はlambrollで管理していますが、API GatewayはTerraformで管理しています。そのため、lambrollで作成したLambda関数のARNをAPI Gateway側で利用する必要があります。この課題をどう解決するかを考えました。
data.aws_resourcegroupstaggingapi_resources
lambrollで管理しているLambda関数をTerraformに持ってくるにはデータソースを使うしかない。しかし、aws_lambda_functionを利用すると、lambroll側で管理する「関数名」との密結合が避けられない。それはしたくないんだ。
この課題を解決する鍵は、resourcegroupstaggingapi_resourcesデータソースを活用することです。これは、AWSリソースに設定されたタグ情報を取得できるTerraformのデータソースで、指定した条件に一致するリソースのARNを取得することができます。
例えば、特定のタグService=yourtagが付与されたLambda関数の名前とARNの一覧を取得するには、以下のようなHCLを記述します。
data "aws_resourcegroupstaggingapi_resources" "lambdas" { resource_type_filters = ["lambda:function"] tag_filter { key = "Service" values = ["yourtag"] } }
このデータソースを使用して、Lambda関数名とARNのマッピングを次のように作成できます。
function_arn_map = { for resource in data.aws_resourcegroupstaggingapi_resources.lambdas.resource_tag_mapping_list : resource.tags["Name"] => resource.resource_arn }
この方法を利用することで、Terraformとlambrollを組み合わせた管理がスムーズになり、API Gatewayとの連携も効率的に行えるようになりました。
なお
こんなことになったのはAPI Gateway構築用のopenapi.yamlをインフラ側で管理しているためでしたが、そもそもopenapi.yamlはアプリの持ち物として管理すべきだったのでは…。