AWS ์์ GCP ๋ก ๋์ด๊ฐ๋ฉด์ ์์ฐ์ค๋ AWS Secrets Manager ์์ GCP Secret Manager ๋ก ๋์ด๊ฐ๊ฒ ๋์์ต๋๋ค.
์๋น์ค ์ด๋ฆ์ด AWS ์์ Secrets ๋ณต์๋ฅผ ์ฌ์ฉํ๊ณ , GCP ์์ Secret ๋จ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ธ ํ๋ฐ๋ถ์์๋ ์ ์ด๋ ๊ฒ ์ง์๋์ง ๋๋ต์ ์ผ๋ก ์ ์ ์๊ฒ ๋ฉ๋๋ค!
Secret Manager ๋ผ๋ ์๋น์ค๋ ์ฌ์ค ํน๋ณํ ๊ธฐ๋ฅ์ ์์ต๋๋ค. ๊ทธ์ ์ํฌ๋ฆฟ์ ์ ์ฅํ๋ ์ ์ฅ์ ์ญํ ์ ํ๋๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ External Secrets ๋ Argo Vault Plugin ์ ์ฌ์ฉํ๋ฉด ์ํ๋ ์ํฌ๋ฆฟ์ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
AWS Secrets Manager ์ ์ต์ํ ์ํ์๊ธฐ ๋๋ฌธ์ GCP ์์๋ ๋น์ทํ๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ๋ค๋ผ๋ ์๊ฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ํ๊ฒ ๋์๋๋ฐ... ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฃ !
์ ๊ฐ ๊ฒช์๋ ์ํฉ์ ์ต๋ํ ์์ํ๊ฒ ์ ๋ฌํ๊ณ ์ถ์ด์ ์ฐจ๊ทผ์ฐจ๊ทผ ์งํํด๋ณด๊ฒ ์ต๋๋ค!
์ฒ์์ ๋ณ ๊ฑฑ์ ์์ด ์์ํ์ง๋ง... Argo Vault Plugin ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๊ฒ๋๋ ์ํฉ๊น์ง ๊ฐ๊ฒ ๋๋๋ฐ...!!
AWS Secrets Manager ๋ ์๋์ ๊ฐ์ด ์ํฌ๋ฆฟ์ ๋ณผ ์ ์์ต๋๋ค.
AWS Console ์์ ๋ณด๋ฉด ๋จ์ํ ์ฌ๋ฌ ๊ฐ์ ์ํฌ๋ฆฟ๋ค์ด ํ์ค ํ์ค ํ ์คํธ๋ก ์ ์ฅ๋๋ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก ์ ๊ฐ๋ค์ Json ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
ํธ์ง์ ๋๋ฅด๊ณ ์ผ๋ฐ ํ ์คํธ ํํ๋ก ๋ณด๋ฉด JSON ์ผ๋ก ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ํ๋์ Secrets Manager ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ ์ฌ๋ฌ ์ํฌ๋ฆฟ๋ค์ ์ ์ฅํด์ ์ฌ์ฉํ์ต๋๋ค.
AWS Secrets Manager > Secret Pool > JSON Secrets ์ด 3๊ฐ์ Depth ๋ฅผ ๊ฐ์ง๋๋ก ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Argo Vault Plugin ์ ์ด์ฉํ์ฌ <test-secret> ์ํฌ๋ฆฟ์ด Secrets Manager ์ ํตํด ๋ณํ๋๊ณ ์ฟ ๋ฒ๋คํฐ์ค Secret ๋ฆฌ์์ค๊ฐ ์์ฑ๋ฉ๋๋ค.
์๋์ ๊ฐ์ด Secert ๋งค๋ํ์คํธ๋ฅผ ์์ฑํ๋ฉด, avp.kubernetes.io/path ์ด๋ ธํ ์ด์ ์ Argo Vault Plugin ๊ฐ ๊ฐ์งํ๊ณ "test-aws-secret" ์์ test-secret ์ key ๋ฅผ ๊ฐ์ง ์ํฌ๋ฆฟ์ ๊ฐ์ ธ์์ ๋ณํ์ ํด์ค๋๋ค.
apiVersion: v1
kind: Secret
metadata:
name: aws-example
annotations:
avp.kubernetes.io/path: "test-aws-secret" # The name of your AWS Secret
stringData:
sample-secret: <test-secret>
type: Opaque
์๋ง AWS Seceret Manager ์ "test-aws-secret"(Secret Pool) ์ ์๋์ ๊ฐ์ ์ํฌ๋ฆฟ์ ์ ์ฅํ๊ณ ์๊ฒ ์ฃ .
{
"test-secert": "Hello World"
}
๋ง์ฝ ์ถ๊ฐ์ ์ธ ์ํฌ๋ฆฟ์ด ํ์ํ๋ค๋ฉด "test-aws-secret"(Secret Pool) ์ "db-password" ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
{
"test-secert": "Hello World"
"db-password": "admin"
}
Argo Vault Plugin ์์ ์๋์ ๊ฐ์ด ์ค๋ช ํ๊ณ ์์ฃ .
AWS Secrets Manager + Argo Vault Plugin ์ ๋ํด์ ์ ๋ฆฌํด๋ณด์๋ฉด,
- AWS Secrets Manager ๋ ํ๋์ Secret Pool ์ ์์ฑํด ๊ทธ ์์์ ์ฌ๋ฌ ๊ฐ์ ์ํฌ๋ฆฟ์ JSON ํํ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ
- Argo Vault Plugin ์์ Placeholder ๋ฅผ ์ด์ฉํด Secrets Manager ์์ ์ํฌ๋ฆฟ์ ๊ฐ์ ธ์ ๋ณํํจ
- ๋ฌธ์ ์์ด ์ ์ฌ์ฉํจ
๊ทธ๋ฆฌ๊ณ GCP Secret Manager ์์๋ ๋ฌธ์ ๊ฐ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
GCP Secret Manager ๋ AWS ์ ๊ต์ฅํ ๋น์ทํด ๋ณด์ ๋๋ค.
๊ทธ๋์ JSON ํํ๋ก ์ ์ฅํด๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ํฉ์ ๋ฐ๋ผ JSON ํํ๋ก ๋ฃ์ด๋ ์ ํ ์๊ด์์ต๋๋ค!
ํ ๋ผํผ ์ฝ๋์์ ์ํฌ๋ฆฟ์ ๊ฐ์ ธ์ฌ ๋ JSON ํํ๊ฐ ์คํ๋ ค ์ ์ฉํฉ๋๋ค!
๋ค๋ง, Argo Vault Plugin ์ ์ฌ์ฉํ๋ ์ ์ฅ์์ ... ์๋ ์๋ ์๋ค!
์ด๋ ๊ฒ ์ํฌ๋ฆฟ์ ์ถ๊ฐํ๊ณ Argo Vault Plugin ๊ฐ์ด๋๋๋ก ์งํ ํ๋๋ฐ..
kind: Secret
apiVersion: v1
metadata:
name: test-secret
annotations:
avp.kubernetes.io/path: projects/12345678987/secrets/test-secret
type: Opaque
data:
password: <test-secret>
์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ฝ์ด๋ณด๋ test-secret ๋ผ๋ ํค๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค.
GCP Secret Manager ์ ๋ํ ์ ๊ทผ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ง์ฝ ์ ๊ทผ์ด ๋๋์ง ์๋๋์ง๋ถํฐ ํ์ธํ๊ณ ์ถ๋ค๋ฉด,
argocd-vault-plugin generate "." --verbose-sensitive-output ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
--verbose-sensitive-output ๋ก ์ธํด GCP Secret Manager ์ ๊ฐ์ด ๋ก๊ทธ๋ก ๋จ๊ฒ ๋ฉ๋๋ค.
์๋.. ๊ทผ๋ฐ ๋ถ๋ช ํ ์์ต๋๋ค.
๋์์๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ค ํด๋ดค์ง๋ง ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ๊ณต์ ๋ฌธ์์ ๋์์๋ ๊ฐ์ด๋ ์ ๋ถ์ธ๋ฐ.. ์ด๊ฑด ๋ญ ์ฌ์ฉ์๊ฐ ์์์ ๋์น๊ป ์ฌ์ฉํด๋ผ ์ ๋์ ๋๋ค ใ ใ
์๋ฌ์ ๋ํ ๋ด์ฉ๋ ๊ตฌ๊ธ๋ง ํด๋ดค์ง๋ง... ๋์ค์ง ์์์ ๊ฒฐ๊ตญ ์ต์ข ํ์ด๊ธฐ๋ฅผ ์จ์ผ ํ์ต๋๋ค..
์ฝ๋๋ฅผ ์ง์ ๊น๋ณด๊ธฐ๋ก ํ๊ฑฐ์ฃ ..!
์ฝ๋์๋ ์ ์๋ฌ ๋ด์ฉ์ด ์๊ฒ ๋ค ์ถ์ด์ Argo Vault Plugin ์ฝ๋๋ฅผ Clone ํ๊ณ ๊น๋ดค์ต๋๋ค.
๊ด๋ จํ ์๋ฌ ๋ด์ฉ์ ์ด๋ ต์ง ์๊ฒ ์ฐพ์์ต๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด secertValue ๊ฐ nil ์์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌ else ๋ก ์ค๋ฉด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ผ secertValue ๊ฐ ์ nil ์ผ๊น? ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด secertValue ๊ฐ ์ด๋์ ์ค๋์ง ์ ์ ์์ต๋๋ค.
์.. ๊ทผ๋ฐ ๋ฌธ์์ด ๊ด๋ จํ ํจ์๊ฐ ๋ง๋ค๋ณด๋ ์ฝ๋๋ง ๋ณด๊ณ ๋์ ๋ฐฉ์์ ์ดํดํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค..
๋๋ฒ๊น ์ ํ ์ ๋ฐ์ ์์ต๋๋ค ใ ใ
goland ๋ฅผ ์ผ์ ์๋์ ๊ฐ์ด configuration ์ ์ค์ ํด์ฃผ๊ณ ๋๋ฒ๊น ์ ์์ํ์ต๋๋ค.
goland ์์ด ๋ช ๋ น์ด๋ง์ผ๋ก๋ ์๋์ ๊ฐ์ต๋๋ค.
$ go run ./main.go generate "./secret.yaml" --verbose-sensitive-output
์คํํ ๋ secret.yaml ์ด ํ๋ ํ์ํ๋ฐ, ์๋์ฒ๋ผ ๋ฐ๋ก ํ๋ ๋ง๋ค์์ต๋๋ค.
kind: Secret
apiVersion: v1
metadata:
name: test-secret
annotations:
avp.kubernetes.io/path: projects/12345678987/secrets/test-secret
type: Opaque
data:
password: <test-secret>
ํธ์์ <test-secret> ๋ก ์จ๋์๋๋ฐ, Secret ์ด๊ธฐ ๋๋ฌธ์ Base64 Encode ๊ฐ ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฒ๊น ์ ์์ํ๋ ์๋ณด์๋ ๊ฒ๋ค์ด ์ข ๋ณด์ด๊ธฐ ์์ํ์ต๋๋ค.
์ฐ์ go viper ๋ฅผ ์ฌ์ฉํด ์คํ๋๊ณ , AVP_TYPE ํ๊ฒฝ๋ณ์๋ฅผ ํตํด Config ๊ฐ์ฒด์ Backend ํ๋๋ ์๋์ฒ๋ผ GCP ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
GCP ์์ฑ์ ํจ์๊ฐ GCP ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํด์ฃผ๋ ๊ฒ ์ ์ ์๊ณ ,
Backend ์ธํฐํ์ด์ค๊ฐ GCP ๋ฅผ ์์๋ฐ๊ณ ,
GCP ๊ฐ์ฒด์๋ Backend ์ธํฐํ์ด์ค ํจ์ ์ค ํ๋์ธ GetIndividualSecret ์ด ๊ตฌํ๋์ด ์๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ผ ๋์น์ ์ ํจ์ ์์ ์๋ a.GetSecrets ํจ์๊ฐ ์ต์ข ์ ์ผ๋ก ํต์ฌ ์ญํ ์ ํ๋ ํจ์์์ ์ ์ ์์ต๋๋ค.
๋ก์ง์ ๋ณด๋ ์ด์ ์ผ ๊ฐ์ด๋์ ์๋ ๋ฐฉ์๋ค์ด ์ ๋ถ ์ดํด๋ฉ๋๋ค.
๋นจ๊ฐ์ ๋ค๋ชจ์ ์๋ data ๊ฐ ๊ฒฐ๊ตญ secretValue ์ธ๋ฐ, ๋ณด์๋ฉด data[secertName] ์ ๋ค์ด๊ฐ๋ secertName ์ ์ค๋ก์ง Secert Manager ID ์ ๋๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋,
"test-secert" ์ ์๋ฌด๋ฆฌ ์๋์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ด๋
{
"test-secert": "Hello World"
"db-password": "admin"
}
data["test-secret"] ๋ก ๋ฐ์ ์๋์, data["test-secret"]["db-password"] ์ ๊ฐ์ด JSON ์ ํน์ ํค๋ฅผ ๊ฐ์ ธ์ฌ ์๊ฐ ์์ต๋๋ค.
data["test-secret"] ๋ JSON ์ "test-secret" ํค๋ฅผ ๋งํ๋๊ฒ ์๋๊ณ GCP Secret Manager ์ Secret Pool ์ ๋งํฉ๋๋ค.
์ ๊ฐ ์ํ๋ ๋ฐฉ์์ "test-secret" ์ด๋ผ๋ Secret Manager ์์์ db-password ๋ผ๋ ํค๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํ๋๋ฐ, ๋์๋ฐฉ์์
data["test-secret"] ๋ฐ์ ์๋๊ธฐ ๋๋ฌธ์ db-password ํค์ ๋ํด์ ๊ฐ์ ธ์ค์ง ๋ชปํฉ๋๋ค.
data["test-secret"] ๋ฅผ ํตํด JSON ํํ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์ํ๋ ํค๋ฅผ ๊ฐ์ ธ์์ผ ํ๋๋ฐ data["test-secret"] ๋ฐ์ ์๋์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ค ๊ฐ์ ธ์ ๊ทธ ์์์ ํน์ ํค์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ํ๋ ํ์๋ฅผ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์๋ฌด๋ฆฌ JSON ์ key ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ๋ณ์ง์ ๋ค ํ์์ด๋ ์์ฉ์ด ์๋๊ฑฐ์ฃ .
์ง์ฌ์ง ์ฝ๋๋ก๋ ์์ ๋ถ๊ฐ๋ฅํฉ๋๋ค ใ ใ
๊ทธ๋ผ ๋ฐ๋ฉด AWS Secrets Manager ์ชฝ์ ์ด๋ป๊ฒ ๋์ด์๋๋?
JSON ์ ํธ๋ค๋ง ํ๋ ๋ถ๋ถ์ด ๋ณด์ ๋๋ค ใ ใ ๊ทธ๋์ AWS Secrets Manager ๋ ๋๊ฑฐ์์ด์.
์ ์ด์ ํ ์ ์์๋ ๊ฑธ ํ๋ฃจ ์ข ์ผ ๋๊ฒ ํ๋ค๊ณ ๊ณ ์ํ์ต๋๋ค ใ ใ ใ
Secrets Manager ๋ฅผ ํ๋ ๋ง๋ค์ด ๊ทธ ์์์ ์ฌ๋ฌ ๊ฐ์ ์ํฌ๋ฆฟ์ JSON ์ผ๋ก ๊ด๋ฆฌํ ์ ์์๋, AWS ์ ๋ฌ๋ฆฌ GCP Secret Manager ๋ ํ๋์ Seceret Manager ๋จ์๊ฐ ์๋ ์ํฌ๋ฆฟ ํ๋ํ๋๋ฅผ ์์ฑํด์ ๊ด๋ฆฌํด์ผ ํ๋ ์ฐจ์ด๊ฐ ์์๋ ๊ฑฐ์ฃ .
AWS ๋ 3 Depth ๊ฐ ๊ฐ๋ฅํ ๋ฐ๋ฉด, GCP ๋ 2 Depth ๋ฐ์ ์๋๋ ๊ฒ์ด์ฃ .
GCP ์์ ๊ฐ์ด๋ ํ๋ ๊ฒ์ด JSON ๋ฐฉ์์ ์๋์ง๋ผ๋ ์ ์ฐ์ฑ์ ์ํด JSON ๋ฐฉ์์ผ๋ก๋ Argo Vault Plugin ์์ ์ง์ํด์คฌ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ทธ๋์ Argo Vault Plugin Issue ์ ์ด ๋ฌธ์ ๋ฅผ ์์ฑํด๋์๊ณ , ์๊ฐ์ด ์์ผ๋ฉด ์ง์ Contribute ๋ฅผ ํ๋ฒ ์๋ํด๋ด์ผ๊ฒ ๋ค์. ์๊ฐ์ด ์์๋ผ๋..
์ด์ฐ๋๋ , ๋ฌธ์ ์์ธ์ ์์๋์ง๋ง AWS ์ ๋ฌ๋ฆฌ GCP + Argo Vault Plugin ์กฐํฉ์ ํฐ ๋ฉ๋ฆฌํธ๊ฐ ์์ด ๋ณด์ฌ์ ์ต์ข ์ ์ผ๋ก๋ External Secrets ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค!
์ค๋์ ์ฌ๊ธฐ๊น์ง!