現状の整理
API Gateway(aws_api_gateway_*): 未定義(Terraform側) → 未着手
Lambda(aws_lambda_function): 未定義 → 未着手
DynamoDB(aws_dynamodb_table.session): importでplanまでしている
S3 バケット(slides_raw): importでplanまでしている
CloudWatch Alarm / SNS / Budgets: 未定義 → 未着手
ここまでやったよ。
terraform state listを実行
↓
data.aws_caller_identity.current
aws_dynamodb_table.session
aws_s3_bucket.slides_raw
aws_s3_bucket_public_access_block.slides_raw
aws_s3_bucket_server_side_encryption_configuration.slides_raw
ok
こういう手順にしていく。
- Lambda 用の IAM ロールと権限を作る
- DynamoDB と S3 にアクセスできるようにする(lamdbaとS3dynamoにアクセスするため)
- Lambda 本体を Terraform で定義する (今のapi functionsに相当)
- API Gateway を Terraform で定義する
- CloudWatch Alarm / SNS / Budgets
ここあたりをmain.tfに追加完了
aws_iam_role
→ LambdaがAWSリソースを操作するためのIAMロールを作成
aws_iam_role_policy_attachment
→ LambdaにCloudWatch Logsへの書き込み権限を付与
aws_iam_role_policy
→ LambdaにDynamoDBとS3へのアクセス権限を付与
aws_lambda_function
→ Node.jsで動くAPI(IppunIchieApi)をLambdaとして定義
aws_cloudwatch_log_group
→ Lambdaの実行ログをCloudWatch Logsに保存する場所を作成
依存関係
Lambdaを単体で作るのではなく、既存のDynamoDB・S3と接続する構成にした。
DynamoDB
↑
│ アクセス権限
│
Lambda ← IAM Role
│
│ アクセス権限
↓
S3
Lambda
↓
CloudWatch Logs
IAM Role
→ Lambdaが使用する権限の土台
IAM Policy
→ LambdaからDynamoDB・S3を操作できる権限を付与
Lambda
→ 作成したIAM Roleを使用してDynamoDB・S3へアクセス
Lambda
→ CloudWatch Logsへ実行ログを出力
Terraformでは、
role = aws_iam_role.lambda.arn
や、
TABLE_NAME = aws_dynamodb_table.session.name
SLIDES_RAW_BUCKET = aws_s3_bucket.slides_raw.bucket
のように既存リソースを参照することで、リソース間の依存関係を定義している