-
Terraform State는 안전한가요? State에 Secrets을 남기지 않는 방법Dev&Ops 2026. 2. 18. 13:59
안녕하세요!
AWS Community Builder이자 Datadog/HashiCorp Ambassbor인 DevOps Engineer인 zerone-code입니다.
최근에 Massive Migration을 진행하기 위해 플랫폼적인 설계와 더불어 Secrets 보관 방법에 대해 여러 방법을 연구하고 있습니다.
지금까지 AWS Secrets Manager나 Parameter Store에 저장하던 중요한 Secrets 값을 어떻게 하면 더 보안 수준이 높게 저장할지에 대해 찾은 방법을 공유하고자 합니다.
궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해 드리도록 하겠습니다.
잘 읽으셨다면 많은 공감과 구독 부탁드립니다!
이번 글에서 사용한 예제 코드는 아래 링크에 있습니다. 참고하시면서 글을 읽으시면 더 도움이 될거 같습니다.
https://github.com/YoungJinJung/test-provisioning/tree/main/terraform/secretsmanager
기존의 Terraform Resource는 생성된 후 그 상태(State)를 tfstate 파일에 기록하여 다음 실행 때 비교했습니다. 그래서 Secrets을 어떤 방법으로 감춰서 생성하더라도, 결국 Terraform State에는 남을 수 밖에 없었습니다.(Fig 1.) 아니면 Dummy값을 넣어서 콘솔에서 수정하는 방식을 사용하기도 했는데, 이는 값의 변화를 추적할 수 없다는 단점이 있습니다.

Fig 1. Terraform State에 남은 Secrets 값 Terraform에서는 Ephemeral Resource라는 개념을 1.10.x 이후 버전부터 도입했습니다. Ephemeral Resources는 이름 그대로 '일시적으로 존재'하는 Resource입니다. 아래 두가지 메커니즘을 메인으로 Ephemeral resource는 동작하게 됩니다.
- 상태 저장 안 함: 실행 시점에만 메모리에 존재하며, 실행이 끝나면 tfstate나 plan 파일에 어떠한 정보도 남기지 않습니다.
- Write-only 메커니즘: 주로 외부 시스템(예: AWS Secrets Manager, Vault)에 데이터를 쓰기만 하고, 그 값 자체를 Terraform이 보관할 필요가 없는 경우에 사용됩니다.
하지만 Ephemeral Resources 만으로는 tfstate에 secrets값이 남는 걸 막을 수 없었습니다.
Ephemeral Resource는 data구분이나 output 구문처럼 다른 Resource에 참고해서 사용하는 경우, 값을 저장하지 않게 해줬습니다.

Terraform Docs에서 Ephemeral Resource에 대한 설명 즉, 생성하려는 Resource에도 Write-only Arguments가 지원되야 Ephemeral Resource를 사용해서 Resource를 생성하고, Terraform State에 값이 남지 않도록 할 수 있다는 뜻이 됩니다.
주로 사용하는 AWS Secrets Manager와 Parameter Store Resource는 1.11.0 이상 버전부터 지원을 하기 시작했습니다.

저는 Sops라는 Provider를 활용해서 Terraform code에서는 Secrets이 보이지 않고, 이를 참조해서 AWS Secrets Manager나 Parameter Store 등 Secrets 값을 코드에 남기지 않도록 구성합니다. 그래서 아래와 같이 sops를 참조하는 부분은 Ephemeral Resource로 구성하고 Write-only Arguments를 적용하지 않았을 때(Fig 2-1.), 아래와 같이 Resource 생성에 오류가 나는 것을 확인해볼 수 있습니다.(Fig 2-2.)

Fig 2-1. Sops Provider에 Ephemeral을 적용 후, AWS Secrets Manager를 생성 
Fig 2-2. Resource 생성에 실패 그렇다면 반대로 Write-Only Arguments만을 활용해서 Terraform State에 Secrets이 남는걸 막을 수 있을까요? 정답은 No입니다.
어디선가 값을 읽어서 참조해야 하고, 그 값을 Write-Only Arguments로 사용하기 때문에 참조해서 생성되는 Resource(Fig 3-1.)는 Terraform State에 Secrets이 남지 않지만(Fig 3-2.), 참조를 해야하는 Resource는 State에 어떤 값이 참조되는지에 대해 보이게 됩니다.(Fig 3-3.)

Fig 3-1. Sops Provider를 적용 후, Write-Only Arguments를 활용해 AWS Secrets Manager를 생성 
Fig 3-2. 참조되는 Sops 리소스에 어떤 값을 참조하는지에 대한 Terraform State 
Fig 3-3. 참조해서 만든 AWS Secrets Manager 이번에는 Ephemeral Resource와 Write-Only Arguments를 모두 적용해서 AWS Secrets Manager Resource를 생성해보도록 하겠습니다. Fig 4-1. 과 같이 참조할 값이 암호화 되있는 sops_file은 Ephemeral Resource로 임시로 참조해서 State에 남지 않도록 구성하고, secrets_string_wo 속성과 sercets_string_wo_version 속성을 활용해서 Write-Only Arguments를 지정해서 Resource를 생성하도록 합니다.

Fig 4-1. Ephemeral Resource와 Write-Only Arguments를 적용해서 Secrets Manager 생성 
Fig 4-2. Ephemeral Resource인 Sops로 복호화한 값이 State 
Fig 4-3. Write-Only Arguments를 적용해서 생성한 AWS Secrets Manager에도 값이 남지 않는 Terraform State 위의 Fig 4-2./Fig 4-3.을 확인해보면 Ephemeral Resource로 임시로 참조한 sops 값은 Fig 3-2.와는 다르게 Terraform State에 남지 않는 것을 확인해볼 수 있습니다. 그리고 생성된 aws_secretsmanager_secret_version Resource에도 secrets_string_wo 속성과 sercets_string_wo_version 속성이 지정되서 참조한 secrets값이 State에 없이 생성된 것을 확인해볼 수 있습니다. 실제로 생성된 Resource를 콘솔에서도 확인해보면(Fig 4-4.), 값이 잘 들어가서 생성된 것을 확인해 볼 수 있습니다.

Fig 4-4. Ephemeral Resource와 Write-Only Arguments를 적용한 AWS SecretsManager의 콘솔 값 이와 같이 Ephemeral Resource와 Write-Only Argumenet가 모두 지원되는 Resource에 대해서는 Terraform State에 Secrets 을 남기지 않고 저장해서 활용할 수 있습니다. 여기서 관리 시, 주의할 점은 기존에는 값을 비교해서 변경점을 확인했지만 Write-Only Argumenets를 적용했기 때문에 State에 값이 남지 않아서 비교를 할 수 없습니다. 따라서 Version을 관리해야 하는데, 위의 AWS Secrets Manager의 예시에서는 sercets_string_wo_version 값을 변경할 때마다 올려줘야한다는 점을 주의해야합니다.
비슷한 문제가 있던 AWS Systems Manager Parameter Store 도 동일하게 1.11.0 이상 버전 부터 지원하는 것을 확인해 볼 수 있습니다. 여기에도 동일하게 적용해 볼 수 있겠죠?

Fig 5. AWS Systems Manager Parameter Store Terraform Resource
지금까지 Terraform State에 Secrets 을 남기지 않는 방법에 대해 공유해봤습니다.
아마 저와 비슷한 고민을 하신 분들이 많을거 같은데, 도움이 되셨으면 좋겠습니다.
궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해 드리도록 하겠습니다.
잘 읽으셨다면 많은 공감과 구독 부탁드립니다!
Reference
https://github.com/YoungJinJung/test-provisioning/tree/main/terraform/secretsmanager
test-provisioning/terraform/secretsmanager at main · YoungJinJung/test-provisioning
Contribute to YoungJinJung/test-provisioning development by creating an account on GitHub.
github.com
https://developer.hashicorp.com/terraform/plugin/framework/ephemeral-resources
Ephemeral resources | Terraform | HashiCorp Developer
Ephemeral resources allow Terraform to reference external data, while guaranteeing that this data will not be persisted in plan or state. Learn how to implement ephemeral resources in the Terraform plugin framework.
developer.hashicorp.com
https://registry.terraform.io/providers/carlpett/sops/latest/docs
Terraform Registry
registry.terraform.io
Terraform Registry
registry.terraform.io
'Dev&Ops' 카테고리의 다른 글
Spring Boot와 함께하는 AWS RDS IAM Auth 활용법(2) (0) 2025.12.31 Why blog? (4) 2022.01.29