๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Airflow

[Airflow] Connection ์ •๋ณด Vault ์ด๊ด€ ์ž‘์—…(feat.Plugin) | LIM

by forestlim 2023. 1. 13.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿง Vault ๋ž€

HashiCorp ์‚ฌ์—์„œ ๋งŒ๋“  ๋น„๋ฐ€์ •๋ณด, ์ฆ‰ ๊ณต๊ฐœ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜(DB ์—ฐ๊ฒฐ ์ •๋ณด), API ํ‚ค, ํ† ํฐ ๋“ฑ์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ”Œ๋žซํผ์ด๋‹ค. 

๐Ÿ‘ฉ‍๐Ÿ’ป ํ˜„์žฌ ์กฐ์ง ๋‚ด์—์„œ Airflow ๊ด€๋ฆฌ ๋ฐฉ์•ˆ

์ง€๊ธˆ ์šฐ๋ฆฌ ํŒ€์€ ๋ฐ์ดํ„ฐ์—”์ง€๋‹ˆ์–ด ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์•„ Airflow ๋ฅผ GCP์˜ managed service ์ธ Composer๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. Composer๋กœ Airflow๋ฅผ ์šด์˜ํ•˜๋ฉด Connection์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Secret Manager ์— airflow prefix๋ฅผ ํ†ตํ•œ ์ €์žฅ
    • ๋™์ผํ•˜๊ฒŒ airflow connection_id ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 
  • ๋‹จ์ˆœ Airflow UI์—์„œ Connection ์„ ์ƒ์„ฑํ•œ๋‹ค.
    • ๋ฌผ๋ก  API ๋กœ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

์œ„ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ Connection์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด Hook์—์„œ connection ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ Secret Manager์™€ Composer์— ์—ฐ๊ฒฐ๋œ DB ๋ชจ๋‘์—์„œ Connection_id ๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. 

 

โ“ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ด์—ˆ๋Š”๊ฐ€

๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด Airflow ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ˜„์žฌ GCP Composer์˜ ๊ฒฝ์šฐ Airflow Version์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ์—ฌํƒœ๊นŒ์ง€ ์Œ“์ธ log ์ •๋ณด์— ๋Œ€ํ•œ migration๊ณผ worker๋“ค์ด ๋‹ค์‹œ ๋„์›Œ์ง€๋Š” ์‹œ๊ฐ„ ๋“ฑ๋“ฑ์„ ๊ณ ๋ คํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฑด ๋‹น์—ฐํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋˜ํ•œ, ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋˜๋ฉด์„œ ๊ธฐ์กด์— ์„œ๋น„์Šค๋“ค๋„ ์ž˜ ๋Œ์•„๊ฐ€๊ฒŒ๋” ํ•ด์ฃผ๋‹ˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

ํ•˜์ง€๋งŒ, ์—ญ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ๋„์ค‘ Composer ๊ฐ€ ์ •์‹ ์„ ์žƒ๊ณ  ์ฃฝ์–ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค...

์ฃฝ์–ด๋ฒ„๋ฆฐ Composer ๋Š” webserver ๋„ ์ฃฝ์–ด๋ฒ„๋ ค์„œ ๊ธฐ์กด์— ์žˆ๋˜ Connection ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‚˜์ค‘์— ์•ˆ ์‚ฌ์‹ค์ด์ง€๋งŒ GCP์— vm์„ ๋„์›Œ์„œ airflow db์™€ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 

์ด๋•Œ ์ˆ˜๋™์œผ๋กœ Composer ํ™˜๊ฒฝ์„ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด์„œ connection ์ •๋ณด๋ฅผ ๋‹ค์‹œ ์ง‘์–ด๋„ฃ์—ˆ๋˜ ์Šฌํ”ˆ ๊ธฐ์–ต์ด ์žˆ๋‹ค...

 

๐Ÿ’ก Secret Manager ์™€ Composer๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค!

์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ worker, webserver, scheduler ๊ฐ€ ๋ชจ๋‘ ์ฃฝ์–ด๋ฒ„๋ ค์„œ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜๋ฐ–์— ์—†์„ ๋•Œ Connection๊ณผ Variable์„ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ญ๊ฐ€ ์žˆ์„๊นŒ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ GCP์˜ Secret Manager๋ฅผ ์ด์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋•Œ ๋˜ ํ•œ ๋ฒˆ Connection์„ ์ „์ˆ˜ ์กฐ์‚ฌํ•ด API๋ฅผ ํ†ตํ•ด Secret Manager๋กœ ์ด๊ด€ํ•˜๋Š” ์ž‘์—…์„ ๊ฑฐ์ณค๋‹ค.. ์ •๋ง ๋ง‰์ผ์˜€๋‹ค..

https://cloud.google.com/composer/docs/secret-manager

 

ํ™˜๊ฒฝ์— Secret Manager ๊ตฌ์„ฑ  |  Cloud Composer  |  Google Cloud

์˜๊ฒฌ ๋ณด๋‚ด๊ธฐ ํ™˜๊ฒฝ์— Secret Manager ๊ตฌ์„ฑ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. Cloud Composer 1 | Cloud Composer 2 ์ด ํŽ˜์ด์ง€์—์„œ๋Š” Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ A

cloud.google.com

 

ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ Airflow DB์— ์ €์žฅํ•  ๋•Œ์ฒ˜๋Ÿผ์˜ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ์กด์žฌํ–ˆ๋‹ค.

  • Airflow ์šฉ Prefix๋ฅผ ์„ค์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ๋ถ„์€ ๊ฐ€์ง€๋งŒ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” Secret ๋ณ€์ˆ˜๋“ค์ด ๋ชจ๋‘ ๋“ค์–ด์žˆ๋‹ค ๋ณด๋‹ˆ ์ง€์ €๋ถ„ํ•ด์ง
  • Secret Manager๋กœ ์˜ฌ๋ฆด ๋•Œ ๊ฐ๊ฐ์˜ Connection ์ •๋ณด๋“ค์„ uri๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ €์žฅํ•ด์•ผ ํ•จ
    • ์ด๋•Œ, uri๋กœ ๋ณ€ํ™˜ ํ›„ secret manger ๊นŒ์ง€ ์ €์žฅํ•˜๋Š” DAG ๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ configuration ์— ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด๋„ ์•”ํ˜ธํ™”๋œ uri ๋กœ ๋ณ€ํ™˜๋˜๋ฉด์„œ ์–ด๋– ํ•œ ์ •๋ณด๋ฅผ ์ž˜๋ชป ๋„ฃ์€ ๊ฑด์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•… ์•ˆ ๋˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Œ

์ด๋Ÿฐ ๋ฌธ์ œ ๋“ฑ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ด ๋ณ€์ˆ˜๋“ค์„ ๊ด€๋ฆฌํ• ๊นŒ ๊ณ ๋ฏผํ•˜๋˜ ์ฐฐ๋‚˜์— ํšŒ์‚ฌ ์ธํ”„๋ผํŒ€์—์„œ vault๋ฅผ ๋„์ž…ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž๋Š” ์˜๊ฒฌ์„ ์ฃผ์…จ๋‹ค. 

 

๐Ÿ˜ƒ ๋ณธ๊ฒฉ Vault ๋„์ž…

Python์—์„œ Vault๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

vault๋ฅผ Airflow์— ์ฒ˜์Œ ๋„์ž…ํ•˜๋˜ ํŒ€์›์ด VaultClient ๋ชจ๋“ˆ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์ž˜ ์•ˆ๋œ๋‹ค๊ณ  ํ•˜์—ฌ ํ˜„์žฌ ์šฐ๋ฆฌ ํŒ€์€ VaultRestAPI๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ์ถ”ํ›„ ์–ด๋– ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ VaultClient๋Š” ๋„์ž…ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค. 

 

Vault์˜ ์ข‹์€ ์ ์€ ์ผ๋‹จ ๊ฐ๊ฐ ํด๋”๋ฅผ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ์ €๋Ÿฐ ์„œ๋น„์Šค์—์„œ์˜ secret value ๋“ค์„ ๋ชจ๋‘ Vault๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ฐ ์„œ๋น„์Šค ๋ณ„๋กœ ํด๋”๋ฅผ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋„ ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค. 

 

๋˜ํ•œ, ๊ธฐ์กด Secret Manager ์‚ฌ์šฉ ์‹œ Airflow Connection ์ •๋ณด๊ฐ€ uri๋กœ ์•”ํ˜ธํ™”๋˜๋ฉด์„œ ์ €์žฅ๋˜์–ด ๊ธฐ์กด ๊ฐ’์ด ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋Š”๋ฐ vault์—์„œ๋Š” ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๋Š” json ํ˜•ํƒœ๋กœ key-value๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋ด๋„ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 

 

 


๋‹ค์Œ ํฌ์ŠคํŒ…์—๋Š” ์ด Vault๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ Airflow Connection์„ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ด์•ผ๊ฒ ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€