# Terraform

# Working with AWS SSO

Terraform does not yet support AWS SSO authentication. The current workaround I've found is using the aws_sso module after being successfully logged in AWS using your usual .aws/config profile setup:

Example .aws/config:

[personal]
region = eu-west-1
output = json
user = pascal

[profile sandbox]
account = 123455678
profile = personal
sso_start_url = https://123456789.awsapps.com/start#/
sso_region = eu-west-1
sso_account_id = 123455678
sso_role_name = AWSAdministratorAccess

First install the aws-sso-credential-provider :

pip install aws-sso-credential-provider -U

I've written a script that allows both authentication to run by calling it through an alias.

Create a file tools/aws-sso-login.sh :

#!/bin/bash

export AWS_PROFILE=$1

aws configure sso --profile $AWS_PROFILE

python -m aws_sso -p $AWS_PROFILE

export AWS_PROFILE="default"
export AWS_DEFAULT_REGION=$2
EOF

Add an alias to export the file's variables to your prefered profile, e.g. ~/.zshrc :

alias aws-sso-login=". ~/tools/aws-sso-login.sh"'

Finally, calling the script to authenticate

aws-sso-login sandbox eu-west-1

# Filter list

Having multiple list and trying to match name with id. In this example, I needed to create 2 separate account list (of ids) under the Organization by matching the name which represents the account type.

data "aws_organizations_organization" "org" {
  provider = aws.core
}

locals {
    traditional_names = [for i in data.aws_organizations_organization.org.accounts[*].name: i if length(regexall("traditional*", i)) > 0]
    native_names = [for i in data.aws_organizations_organization.org.accounts[*].name: i if length(regexall("native*", i)) > 0]

    traditional_ids = matchkeys(data.aws_organizations_organization.org.accounts[*].id, data.aws_organizations_organization.org.accounts[*].name, local.traditional_names)
    native_ids = matchkeys(data.aws_organizations_organization.org.accounts[*].id, data.aws_organizations_organization.org.accounts[*].name, local.native_names)
}