11locals {
22 stage_for_api = var. app_env == " dev" ? var. app_env : var. app_environment
33 api_name = " ${ var . app_name } -${ local . stage_for_api } "
4+ aws_account = data. aws_caller_identity . this . account_id
45}
56
6- /*
7- * Module docs: https://registry.terraform.io/modules/silinternational/serverless-user/aws/latest
8- * Create IAM user with permissions to create lambda function, API gateway, etc.
9- */
10- module "serverless-user" {
11- source = " silinternational/serverless-user/aws"
12- version = " ~> 0.4.2"
13-
14- app_name = " ${ var . app_name } -${ var . app_env } "
15- aws_region_policy = " *"
16- enable_api_gateway = true
17- extra_policies = [jsonencode ({
7+ data "aws_caller_identity" "this" {}
8+
9+ # CDK IAM user
10+ resource "aws_iam_user" "cdk" {
11+ name = " ${ var . app_name } -cdk"
12+ }
13+
14+ resource "aws_iam_access_key" "cdk" {
15+ user = aws_iam_user. cdk . name
16+ }
17+
18+ resource "aws_iam_policy" "cdk" {
19+ name = " ${ var . app_name } -cdk"
20+ description = " CDK deployment policy"
21+
22+ policy = jsonencode ({
1823 Version = " 2012-10-17"
19- Statement = [
20- {
21- Effect = " Allow"
22- Action = [
23- " sts:AssumeRole" ,
24- ]
25- Resource = " arn:aws:iam::*:role/cdk-*"
26- },
27- {
28- Effect = " Allow"
29- Action = [
30- " ec2:CreateTags" ,
31- " ec2:DeleteTags" ,
32- " iam:getRolePolicy" ,
33- " logs:FilterLogEvents" ,
34- " apigateway:UpdateRestApiPolicy" ,
35- ]
36- Resource = " *"
37- }
38- ]
39- })]
24+ Statement = [{
25+ Effect = " Allow"
26+ Action = " sts:AssumeRole"
27+ Resource = " arn:aws:iam::*:role/cdk-*"
28+ }]
29+ })
30+ }
31+
32+ resource "aws_iam_user_policy_attachment" "cdk" {
33+ user = aws_iam_user. cdk . name
34+ policy_arn = aws_iam_policy. cdk . arn
4035}
4136
4237// Set up custom domain name for easier fail-over.
@@ -73,23 +68,17 @@ resource "aws_iam_role" "lambdaRole" {
7368 })
7469}
7570
76- locals {
77- api_key_table = try (var. api_key_table , one (aws_dynamodb_table. apiKeyTable [* ]. name ))
78- totp_table = try (var. totp_table , one (aws_dynamodb_table. totp [* ]. name ))
79- webauthn_table = try (var. webauthn_table , one (aws_dynamodb_table. webauthnTable [* ]. name ))
80- }
81-
8271data "template_file" "lambdaRolePolicy" {
8372 template = file (" ${ path . module } /lambda-role-policy.json" )
8473 vars = {
85- aws_account = var.aws_account_id
74+ aws_account = local.aws_account
8675 app_name = var.app_name
8776 app_env = var.app_env
88- table_arns = join (" ," , compact ( [
89- local . api_key_table == null ? null : " \" arn:aws:dynamodb:*: ${ var . aws_account_id } :table/ ${ local . api_key_table } \" " ,
90- local . webauthn_table == null ? null : " \" arn:aws:dynamodb:*: ${ var . aws_account_id } :table/ ${ local . webauthn_table } \" " ,
91- local . totp_table == null ? null : " \" arn:aws:dynamodb:*: ${ var . aws_account_id } :table/ ${ local . totp_table } \" " ,
92- ]))
77+ table_arns = join (" ," , [
78+ aws_dynamodb_table . api_key . arn ,
79+ aws_dynamodb_table . totp . arn ,
80+ aws_dynamodb_table . webauthn . arn ,
81+ ])
9382 }
9483}
9584
@@ -99,30 +88,37 @@ resource "aws_iam_role_policy" "lambdaRolePolicy" {
9988 policy = data. template_file . lambdaRolePolicy . rendered
10089}
10190
102- // Create DynamoDB tables
103- resource "aws_dynamodb_table" "apiKeyTable" {
104- count = var. create_api_key_table ? 1 : 0
105- name = " ${ var . app_name } -${ var . app_env } -api-key"
106- billing_mode = " PAY_PER_REQUEST"
107- hash_key = " value"
91+ // DynamoDB tables
92+ resource "aws_dynamodb_table" "api_key" {
93+ name = " mfa-api_${ var . app_env } _api-key_global"
94+ billing_mode = " PAY_PER_REQUEST"
95+ hash_key = " value"
96+ deletion_protection_enabled = true
97+ stream_enabled = true
98+ stream_view_type = " NEW_IMAGE"
10899
109100 attribute {
110101 name = " value"
111102 type = " S"
112103 }
113104
114- tags = {
115- app_name = var.app_name
116- app_env = var.app_env
105+ point_in_time_recovery {
106+ enabled = true
107+ }
108+
109+ replica {
110+ region_name = var. aws_region_secondary
111+ }
112+
113+ lifecycle {
114+ ignore_changes = [replica ]
117115 }
118116}
119117
120118resource "aws_dynamodb_table" "totp" {
121- count = var. create_totp_table ? 1 : 0
122-
123- name = " ${ var . app_name } _${ var . app_env } _totp_global"
124- hash_key = " uuid"
119+ name = " mfa-api_${ var . app_env } _totp_global"
125120 billing_mode = " PAY_PER_REQUEST"
121+ hash_key = " uuid"
126122 deletion_protection_enabled = true
127123 stream_enabled = true
128124 stream_view_type = " NEW_IMAGE"
@@ -145,19 +141,28 @@ resource "aws_dynamodb_table" "totp" {
145141 }
146142}
147143
148- resource "aws_dynamodb_table" "webauthnTable" {
149- count = var. create_webauthn_table ? 1 : 0
150- name = " ${ var . app_name } -${ var . app_env } -webauthn"
151- billing_mode = " PAY_PER_REQUEST"
152- hash_key = " uuid"
144+ resource "aws_dynamodb_table" "webauthn" {
145+ name = " mfa-api_${ var . app_env } _u2f_global"
146+ hash_key = " uuid"
147+ billing_mode = " PAY_PER_REQUEST"
148+ deletion_protection_enabled = true
149+ stream_enabled = true
150+ stream_view_type = " NEW_IMAGE"
153151
154152 attribute {
155153 name = " uuid"
156154 type = " S"
157155 }
158156
159- tags = {
160- app_name = var.app_name
161- app_env = var.app_env
157+ point_in_time_recovery {
158+ enabled = true
159+ }
160+
161+ replica {
162+ region_name = var. aws_region_secondary
163+ }
164+
165+ lifecycle {
166+ ignore_changes = [replica ]
162167 }
163168}
0 commit comments