æ¬è¨äºã¯
IaCã¦ã£ã¼ã¯
8æ¥ç®ã®è¨äºã§ãã
âï¸
7æ¥ç®
â¶â¶ æ¬è¨äº â¶â¶
9æ¥ç®
ð»

ã¯ããã«
NTã·ã¹ãã äºæ¥ï¼é¨ã®åéã¨ç³ãã¾ãã IaCã¦ã£ã¼ã¯ã¨ãããã¨ã§ãä»åã¯IaCãã¼ã«ã§ããTerraformã§ç§å¯æ å ±ãã³ã¼ãåããéã«ãAWS Secrets Managerãç¨ããæ¹æ³ããç´¹ä»ãã¾ãã
Terraformã¨ã¯
Terraformã¨ã¯ãããããã¤ã³ãã©ã¹ãã©ã¯ãã£ãã³ã¼ãã§ç®¡çããããã®ãã¼ã«ã§ãHashiCorp社ã«ãã£ã¦éçºããã¦ãã¾ãã ç°¡åã«è¨ãã¨ããµã¼ãã¼ããããã¯ã¼ã¯ãªã©ã®ã¯ã©ã¦ããªã½ã¼ã¹ããè¨å®ãã¡ã¤ã«ãã§å®ç¾©ããèªåçã«æ§ç¯ã»å¤æ´ã»åé¤ã§ããä»çµã¿ã§ãã
主ãªç¹å¾´ï¼
- ã¤ã³ãã©æ§æãã³ã¼ãï¼HCL: HashiCorp Configuration Languageï¼ã§è¨è¿°ãããã¨ã§ãåç¾æ§ã»ãã¼ã¸ã§ã³ç®¡çãå¯è½ã§ãã
- AWSãAzureãGCPãªã©è¤æ°ã®ã¯ã©ã¦ããµã¼ãã¹ã䏿¬ç®¡çã§ãã¾ãã

æ³å®ããã·ã¼ã³
AWSã®ãªã½ã¼ã¹ãTerraformã§ã³ã¼ãã£ã³ã°ãã¦ããæããªã½ã¼ã¹ã®è¨å®å¤ã«ç§å¯æ å ±ï¼ãã¹ã¯ã¼ããTokenï¼ãªã©ãè¨å®ããªããã°ãªããªãã·ã¼ã³ã¯å°ãªãããåå¨ãã¾ãã ä¾ã¨ãã¦ã¯ä»¥ä¸ã®ãããªå ´åã§ãã
- Amazon Cognitoã®identity providerãè¨å®ããéã飿ºãããidentity providerããçºè¡ãããclient_id,client_secretãè¨å®ãããã
- RDSã®ãªã½ã¼ã¹ãåææ§ç¯ããéã®rootãã¹ã¯ã¼ããè¨å®ãããã
- AWS Lambdaã®ç°å¢å¤æ°ã«å¤é¨APIã®Tokenãè¨å®ããã
ãã®æãä¸è¬çãªæ¹æ³ã¨ãã¦ããç´¹ä»ãããã®ã¯TF_VARSãç¨ããæ¹å¼ã§ãã 以ä¸ã¯Amazon Cognitoã®user poolã«ç´ã¥ããIDPãè¨å®ããã³ã¼ãã«ãªãã¾ãã
夿°ã®å®ç¾©
variable "client_id" {
type = string
sensitive = true
}
variable "client_secret" {
type = string
sensitive = true
}
Amazon Cognitoãªã½ã¼ã¹ã®å®ç¾©
locals {
issuer_url = "https://external.auth.provider.example.com/idp"
}
resource "aws_cognito_user_pool" "example-user-pool" {
name = "example"
auto_verified_attributes = ["email"]
tags = {}
username_attributes = ["email"]
account_recovery_setting {
recovery_mechanism {
name = "admin_only"
priority = 1
}
}
}
resource "aws_cognito_identity_provider" "external-idp" {
user_pool_id = aws_cognito_user_pool.example-user-pool.id
provider_name = "external.idp"
provider_type = "OIDC"
provider_details = {
attributes_request_method = "GET"
attributes_url = "${local.issuer_url}/oidc/userinfo"
attributes_url_add_attributes = false
authorize_scopes = "openid me"
authorize_url = "${local.issuer_url}/oidc/authorization"
client_id = var.client_id
client_secret = var.client_secret
jwks_uri = "${local.issuer_url}/oidc/jwks"
oidc_issuer = local.issuer_url
token_url = "${local.issuer_url}/oidc/token"
}
}
client_id,client_secretã«å ã»ã©å®ç¾©ããvar.client_id,var.client_secretãè¨å®ãã¾ãã
client_id,client_secretã®å¤ãå¥ãã¡ã¤ã«ï¼terraform.tfvarsï¼ã«ã¦è¨è¿°ãã¾ãã
client_id = "your-id" client_secret = "your-secret"
Terraformã®ã³ã¼ãã¯gitãªã©ã®ãªãã¸ããªã§ç®¡çããããã¨ãå¤ãã®ã§ãããä¸è¨ã®æ¹æ³ã使ç¨ãããã¨ã§ terraform.tfvarsãgitãªãã¸ããªããé¤å¤ï¼.gitignoreãã¡ã¤ã«ã«è¨è¼ï¼ããã»ãã¥ã¢ãªæ å ±ãGitãªãã¸ããªã«ã¢ãããã¼ãããããã¨ãé²ãã¾ãã
ããããã®æ¹å¼ã¯æè»½ã§ããåé¢ã誤ã£ã¦gitãªãã¸ããªã«è¿½å ãã¦ãã¾ããªã¹ã¯ãéçºè ã®ãã¼ã«ã«ã§ä½æããtfvarsãã¡ã¤ã«ã®å 容ãå ±æããæ¹æ³ãæ¤è¨ããªããã°ãªããªããªã©ã è¦æ¨¡ã®å¤§ããªéçºã«ãªãã°ãªãã»ã©èª²é¡ãåºã¦ãã¾ãã
ããã§ãç´¹ä»ãããã®ãSecrets Managerãå©ç¨ããç§å¯æ å ±ãTerraformããåå¾ããæ¹æ³ã§ãã
å®è£ æ¹æ³
ä»åã¯ä¾ã¨ãã¦ä¸è¨ã¨åæ§Amazon Cognitoã®idpãå®è£ ããæ¹æ³ããç´¹ä»ãã¾ãã
Secrets Managerã®è¨å®
ã¾ãããã¸ã¡ã³ãã³ã³ã½ã¼ã«ããSecrets Managerãªã½ã¼ã¹ã使ãã¾ãã

ãã®ä»ã®ã·ã¼ã¯ã¬ããã¿ã¤ãã鏿ããclient_id,client_secretã®å¤ãè¨å®ãã¾ãã

ããã§ã¯ãã¼ã/cognito/idpã¨ãã¦ããã¾ãã

ãã¼ãã¼ã·ã§ã³ã¯ç¡å¹ã«ãã¦ããã¾ãã

è¨å®ãå®äºãããä¿åãã¯ãªãã¯ãã¾ãã

Terraformå´ã®å®è£
Terraformã®ã³ã¼ãã以ä¸ã®ããã«å®è£ ãã¾ãã dataãããã¯ã§Secrets Managerããåå¾ããå 容ãJSONå½¢å¼ã§ãã³ã¼ãããã¨ãTerraformã®ã³ã¼ãä¸ã§ä½¿ç¨ã§ããããã«ãªãã¾ãã
data "aws_secretsmanager_secret_version" "idp_secrets" {
secret_id = "/cognito/idp"
}
locals {
idp_secrets = jsondecode(data.aws_secretsmanager_secret_version.idp_secrets.secret_string)
issuer_url = "https://external.auth.provider.example.com/idp"
}
resource "aws_cognito_user_pool" "example-user-pool" {
name = "example"
auto_verified_attributes = ["email"]
tags = {}
username_attributes = ["email"]
account_recovery_setting {
recovery_mechanism {
name = "admin_only"
priority = 1
}
}
}
resource "aws_cognito_identity_provider" "external-idp" {
user_pool_id = aws_cognito_user_pool.example-user-pool.id
provider_name = "external.idp"
provider_type = "OIDC"
provider_details = {
attributes_request_method = "GET"
attributes_url = "${local.issuer_url}/oidc/userinfo"
attributes_url_add_attributes = false
authorize_scopes = "openid me"
authorize_url = "${local.issuer_url}/oidc/authorization"
client_id = local.idp_secrets.client_id
client_secret = local.idp_secrets.client_secret
jwks_uri = "${local.issuer_url}/oidc/jwks"
oidc_issuer = local.issuer_url
token_url = "${local.issuer_url}/oidc/token"
}
}
ä¸è¨ã®ããã«ãã¦ã»ãã¥ã¢ã«å¤é¨ã®èªè¨¼åºç¤ã¨ã®é£æºè¨å®ãå®è£ ã§ãã¾ããã
ã¡ãªãã
ä¸è¨ã®å®è£ ã§ã®ã¡ãªããã¯ä»¥ä¸ã®ãããªãã®ãèãããã¾ãã
- ã³ã¼ãä¸ã«ç§å¯æ å ±ãè¨è¼ããªãã¦ãè¯ãã
- ç§å¯æ å ±ã®å ±æãåãæ¸¡ããSecrets Managerçµç±ã§è¡ããã¨ãã§ãããã¨ã«ãã£ã¦ç§å¯æ å ±ã®æ£å¨ãã¦ã¼ã¶ã¼éã®å ±ææã®æ¼æ´©ãé²ããã
- ç§å¯æ å ±ã®å徿¹å¼ã®å®è£ ãçµ±ä¸ãããã¨ã§ã³ã¼ãã£ã³ã°ãã¹ããã°ã®é²æ¢ãã§ããã
注æç¹
stateãã¡ã¤ã«ã®æ±ã
ä¸è¨æ¹å¼ã§å®è£ ããã¨ãã¦ãTerraformã§ãªã½ã¼ã¹ãå®è£ ããæã«ä½æãããstateãã¡ã¤ã«ã«ã¯ç§å¯æ å ±ãè¨è¼ããã¾ãã stateãã¡ã¤ã«ã¯é常ã§ãã¨S3ãã±ããã«ä¿åããã®ãä¸è¬çã§ããããã¼ã«ã«ã«ä½æãããã¨ãå¯è½ã§ãã ç§å¯æ å ±ãTerraformã§å®è£ ããéã«ã¯ä¸è¨ã®ãã¨ããµã¾ã以ä¸ã®ã¢ããã¼ããã¨ã£ã¦ãã ããã
- Terraformã®stateãã¡ã¤ã«ãS3ã«ä¿ç®¡ããï¼S3ããã¯ã¨ã³ãï¼ããã®S3ãã±ããã®æå·åã宿½ããã
- ãããã¼ã«ã«ã§stateãã¡ã¤ã«ãæ±ãå ´åã¯.gitignoreã«terraform.tfstateããã³terraform.tfstate.backupã追å ãgitãªãã¸ããªã«ã¢ãããã¼ããããªãããã«ããã
åèï¼S3ããã¯ã¨ã³ããTerraformã§è¨å®ããä¾
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "cognito/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true # æå·åãæå¹å
dynamodb_table = "terraform-lock" # ç¶æ
ããã¯ç¨ã®DynamoDBãã¼ãã«
}
}
è²»ç¨é¢ã®åé¡
AWS Secrets Managerã¯ææãµã¼ãã¹ã«ãªãã¾ãã®ã§ã以ä¸ã®æéããããã¾ãã
- ã·ã¼ã¯ã¬ãã1ã¤ããã: æé¡$0.40
- APIå¼ã³åºã: 10,000åããã$0.05
ã³ã¹ããæãããå ´åã¯ãAWS Systems Manager Parameter Storeï¼SecureStringï¼ã®å©ç¨ãæ¤è¨ã§ãã¾ãã
AWS Systems Manager Parameter Storeã§ã®å®è£ ä¾ï¼
data "aws_ssm_parameter" "idp_client_id" {
name = "/cognito/idp/client_id"
}
data "aws_ssm_parameter" "idp_client_secret" {
name = "/cognito/idp/client_secret"
with_decryption = true # SecureStringãè¨å®ãã¦ããå ´åãã¡ãã®ããããã£ãå¿
è¦ã§ãã
}
locals {
issuer_url = "https://external.auth.provider.example.com/idp"
}
resource "aws_cognito_user_pool" "example-user-pool" {
name = "example"
auto_verified_attributes = ["email"]
tags = {}
username_attributes = ["email"]
account_recovery_setting {
recovery_mechanism {
name = "admin_only"
priority = 1
}
}
}
resource "aws_cognito_identity_provider" "external-idp" {
user_pool_id = aws_cognito_user_pool.example-user-pool.id
provider_name = "external.idp"
provider_type = "OIDC"
provider_details = {
attributes_request_method = "GET"
attributes_url = "${local.issuer_url}/oidc/userinfo"
attributes_url_add_attributes = false
authorize_scopes = "openid me"
authorize_url = "${local.issuer_url}/oidc/authorization"
client_id = data.aws_ssm_parameter.idp_client_id.value
client_secret = data.aws_ssm_parameter.idp_client_secret.value
jwks_uri = "${local.issuer_url}/oidc/jwks"
oidc_issuer = local.issuer_url
token_url = "${local.issuer_url}/oidc/token"
}
}
ã¾ã¨ã
IaCã§èª²é¡ã«ãªããã¡ãªã®ãç§å¯æ å ±ã®æ±ãæ¹ãªã®ã§ãããSecrets Managerã使ç¨ãããã¨ã§ã»ãã¥ã¢ãªæ å ±ãã³ã¼ãã«è¨è¼ãããã¨ãªãå®è£ ãå¯è½ã§ãã ç¹ã«å¤é¨ã®SaaSã¨é£æºããã¤ã³ãã©ã®æ§ç¯ã¯æ¨ä»è¦æ±ãé«ã¾ã£ã¦ãã¦ããåéã ã¨æãã¾ãã®ã§ããã²ãæ´»ç¨ãã ããã