@@ -46,6 +46,97 @@ atlas clusters create "${clusterName}" --projectId "${projectId}" --backup --pro
4646atlas clusters watch " ${clusterName} " --projectId " ${projectId} "
4747echo -e " Created Cluster \" ${clusterName} \" "
4848
49+ # AWS IAM role creation and authorization for Lambda connections
50+ echo " --------------------------------AWS Lambda IAM Role creation starts ----------------------------"
51+
52+ # Get AWS Account ID
53+ AWS_ACCOUNT_ID=$( aws sts get-caller-identity --query Account --output text)
54+
55+ # Role names for CREATE and UPDATE scenarios
56+ iamRoleNameCreate=" mongodb-atlas-streams-lambda-$( date +%s) -${RANDOM} "
57+ iamRoleNameUpdate=" mongodb-atlas-streams-lambda-$( date +%s) -${RANDOM} -updated"
58+ policyName=" atlas-lambda-invoke-policy"
59+
60+ echo " Creating IAM roles: ${iamRoleNameCreate} and ${iamRoleNameUpdate} "
61+
62+ # Create first cloud provider access entry (for CREATE role)
63+ roleIdCreate=$( atlas cloudProviders accessRoles aws create --projectId " ${projectId} " --output json | jq -r ' .roleId' )
64+ echo " Created Atlas cloud provider access entry for CREATE role: ${roleIdCreate} "
65+
66+ # Create second cloud provider access entry (for UPDATE role)
67+ roleIdUpdate=$( atlas cloudProviders accessRoles aws create --projectId " ${projectId} " --output json | jq -r ' .roleId' )
68+ echo " Created Atlas cloud provider access entry for UPDATE role: ${roleIdUpdate} "
69+
70+ # Get Atlas AWS Account ARN and External ID for CREATE role
71+ atlasAWSAccountArnCreate=$( atlas cloudProviders accessRoles list --projectId " ${projectId} " --output json | jq --arg roleID " ${roleIdCreate} " -r ' .awsIamRoles[] | select(.roleId | test($roleID)) | .atlasAWSAccountArn' )
72+ atlasAssumedRoleExternalIdCreate=$( atlas cloudProviders accessRoles list --projectId " ${projectId} " --output json | jq --arg roleID " ${roleIdCreate} " -r ' .awsIamRoles[] | select(.roleId | test($roleID)) | .atlasAssumedRoleExternalId' )
73+
74+ # Get Atlas AWS Account ARN and External ID for UPDATE role
75+ atlasAWSAccountArnUpdate=$( atlas cloudProviders accessRoles list --projectId " ${projectId} " --output json | jq --arg roleID " ${roleIdUpdate} " -r ' .awsIamRoles[] | select(.roleId | test($roleID)) | .atlasAWSAccountArn' )
76+ atlasAssumedRoleExternalIdUpdate=$( atlas cloudProviders accessRoles list --projectId " ${projectId} " --output json | jq --arg roleID " ${roleIdUpdate} " -r ' .awsIamRoles[] | select(.roleId | test($roleID)) | .atlasAssumedRoleExternalId' )
77+
78+ # Create trust policy for CREATE role
79+ jq --arg atlasAssumedRoleExternalId " $atlasAssumedRoleExternalIdCreate " \
80+ --arg atlasAWSAccountArn " $atlasAWSAccountArnCreate " \
81+ ' .Statement[0].Principal.AWS?|=$atlasAWSAccountArn | .Statement[0].Condition.StringEquals["sts:ExternalId"]?|=$atlasAssumedRoleExternalId' \
82+ " $( dirname " $0 " ) /lambda-role-policy-template.json" > " $( dirname " $0 " ) /lambda-trust-policy-create.json"
83+
84+ # Create trust policy for UPDATE role
85+ jq --arg atlasAssumedRoleExternalId " $atlasAssumedRoleExternalIdUpdate " \
86+ --arg atlasAWSAccountArn " $atlasAWSAccountArnUpdate " \
87+ ' .Statement[0].Principal.AWS?|=$atlasAWSAccountArn | .Statement[0].Condition.StringEquals["sts:ExternalId"]?|=$atlasAssumedRoleExternalId' \
88+ " $( dirname " $0 " ) /lambda-role-policy-template.json" > " $( dirname " $0 " ) /lambda-trust-policy-update.json"
89+
90+ echo " --------------------------------AWS IAM Role creation starts ----------------------------"
91+
92+ # Check if CREATE role exists, delete if found
93+ awsRoleIdCreate=$( aws iam get-role --role-name " ${iamRoleNameCreate} " 2> /dev/null | jq --arg roleName " ${iamRoleNameCreate} " -r ' .Role | select(.RoleName==$roleName) | .RoleId' || echo " " )
94+ if [ -n " $awsRoleIdCreate " ]; then
95+ aws iam delete-role-policy --role-name " ${iamRoleNameCreate} " --policy-name " ${policyName} " 2> /dev/null || true
96+ aws iam delete-role --role-name " ${iamRoleNameCreate} "
97+ echo " Deleted existing CREATE role"
98+ fi
99+
100+ # Create CREATE role
101+ awsRoleIdCreate=$( aws iam create-role --role-name " ${iamRoleNameCreate} " --assume-role-policy-document file://" $( dirname " $0 " ) " /lambda-trust-policy-create.json | jq --arg roleName " ${iamRoleNameCreate} " -r ' .Role | select(.RoleName==$roleName) | .RoleId' )
102+ echo " Created AWS IAM role for CREATE: ${awsRoleIdCreate} "
103+
104+ # Check if UPDATE role exists, delete if found
105+ awsRoleIdUpdate=$( aws iam get-role --role-name " ${iamRoleNameUpdate} " 2> /dev/null | jq --arg roleName " ${iamRoleNameUpdate} " -r ' .Role | select(.RoleName==$roleName) | .RoleId' || echo " " )
106+ if [ -n " $awsRoleIdUpdate " ]; then
107+ aws iam delete-role-policy --role-name " ${iamRoleNameUpdate} " --policy-name " ${policyName} " 2> /dev/null || true
108+ aws iam delete-role --role-name " ${iamRoleNameUpdate} "
109+ echo " Deleted existing UPDATE role"
110+ fi
111+
112+ # Create UPDATE role
113+ awsRoleIdUpdate=$( aws iam create-role --role-name " ${iamRoleNameUpdate} " --assume-role-policy-document file://" $( dirname " $0 " ) " /lambda-trust-policy-update.json | jq --arg roleName " ${iamRoleNameUpdate} " -r ' .Role | select(.RoleName==$roleName) | .RoleId' )
114+ echo " Created AWS IAM role for UPDATE: ${awsRoleIdUpdate} "
115+
116+ # Get role ARNs
117+ awsArnCreate=$( aws iam get-role --role-name " ${iamRoleNameCreate} " | jq --arg roleName " ${iamRoleNameCreate} " -r ' .Role | select(.RoleName==$roleName) | .Arn' )
118+ awsArnUpdate=$( aws iam get-role --role-name " ${iamRoleNameUpdate} " | jq --arg roleName " ${iamRoleNameUpdate} " -r ' .Role | select(.RoleName==$roleName) | .Arn' )
119+
120+ # Attach Lambda permissions to both roles
121+ aws iam put-role-policy --role-name " ${iamRoleNameCreate} " --policy-name " ${policyName} " --policy-document file://" $( dirname " $0 " ) " /lambda-permissions-template.json
122+ aws iam put-role-policy --role-name " ${iamRoleNameUpdate} " --policy-name " ${policyName} " --policy-document file://" $( dirname " $0 " ) " /lambda-permissions-template.json
123+ echo " Attached Lambda invoke permissions to both roles"
124+
125+ echo " --------------------------------AWS IAM Role creation ends ----------------------------"
126+
127+ # Wait for AWS IAM role to propagate (similar to encryption-at-rest pattern)
128+ echo " Waiting for IAM roles to propagate..."
129+ sleep 65
130+
131+ # Authorize the roles in Atlas
132+ echo " --------------------------------Authorize MongoDB Atlas Roles starts ----------------------------"
133+ atlas cloudProviders accessRoles aws authorize " ${roleIdCreate} " --iamAssumedRoleArn " ${awsArnCreate} " --projectId " ${projectId} "
134+ echo " Authorized CREATE role: ${iamRoleNameCreate} "
135+
136+ atlas cloudProviders accessRoles aws authorize " ${roleIdUpdate} " --iamAssumedRoleArn " ${awsArnUpdate} " --projectId " ${projectId} "
137+ echo " Authorized UPDATE role: ${iamRoleNameUpdate} "
138+ echo " --------------------------------Authorize MongoDB Atlas Roles ends ----------------------------"
139+
49140jq --arg cluster_name " $clusterName " \
50141 --arg workspace_name " $workspaceName " \
51142 --arg project_id " $projectId " \
@@ -99,17 +190,21 @@ jq --arg workspace_name "$workspaceName" \
99190jq --arg workspace_name " $workspaceName " \
100191 --arg project_id " $projectId " \
101192 --arg profile " $profile " \
193+ --arg role_arn " $awsArnCreate " \
102194 ' .Profile?|=$profile
103195 | .ProjectId?|=$project_id
104- | .WorkspaceName?|=$workspace_name' \
196+ | .WorkspaceName?|=$workspace_name
197+ | .Aws.RoleArn=$role_arn' \
105198 " $( dirname " $0 " ) /inputs_4_create.json" > " inputs/inputs_4_create.json"
106199
107200jq --arg workspace_name " $workspaceName " \
108201 --arg project_id " $projectId " \
109202 --arg profile " $profile " \
203+ --arg role_arn " $awsArnUpdate " \
110204 ' .Profile?|=$profile
111205 | .ProjectId?|=$project_id
112- | .WorkspaceName?|=$workspace_name' \
206+ | .WorkspaceName?|=$workspace_name
207+ | .Aws.RoleArn=$role_arn' \
113208 " $( dirname " $0 " ) /inputs_4_update.json" > " inputs/inputs_4_update.json"
114209
115210jq --arg workspace_name " $workspaceName " \
@@ -143,4 +238,3 @@ jq --arg workspace_name "$workspaceName" \
143238 | .ProjectId?|=$project_id
144239 | .WorkspaceName?|=$workspace_name' \
145240 " $( dirname " $0 " ) /inputs_6_update.json" > " inputs/inputs_6_update.json"
146-
0 commit comments