OIDC 출전작인 Terraform Canvas 사전공부 중에 리소스 옵션의 정보가 많은 항목에 대해서 어떻게 처리할지에 대한 내용이다. 예를 들어, 콘솔에서 ec2를 생성한다고 할 때 인스턴스 타입에 많은 종류가 있는데 이걸 사용자에게 토글로 제공해주고싶다. 이럴 때 해당 정보들을 어떻게 받아올까.. 하다가 sdk가 우리가 사용예정 언어인 Go로 잘 나와있다고 해서 사용해 보려고 한다.
AWS CLI로도 받아와 봤는데 쿼리가 잘 안 되는 것 같아서 sdk-go로 진행하기로 했다!
package main
import (
"encoding/json"
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/rds"
)
// JSON 출력용 구조체 정의
type EngineVersionInfo struct {
EngineVersion string `json:"EngineVersion"`
DBParameterGroupFamily string `json:"DBParameterGroupFamily"`
}
func main() {
// AWS 세션 생성
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
// RDS 서비스 클라이언트 생성
svc := rds.New(sess)
engine := "mysql"
// DB 엔진 버전 정보 가져오기
input := &rds.DescribeDBEngineVersionsInput{
Engine: aws.String(engine),
}
result, err := svc.DescribeDBEngineVersions(input)
if err != nil {
fmt.Println("Error occurred while describing DB engine versions:", err)
return
}
// 필요한 필드만 추출
var engineVersions []EngineVersionInfo
for _, version := range result.DBEngineVersions {
engineVersionInfo := EngineVersionInfo{
EngineVersion: *version.EngineVersion,
DBParameterGroupFamily: *version.DBParameterGroupFamily,
}
engineVersions = append(engineVersions, engineVersionInfo)
}
// JSON으로 변환
jsonData, err := json.Marshal(engineVersions)
if err != nil {
fmt.Println("Error occurred while marshaling JSON:", err)
return
}
fmt.Println(string(jsonData))
}
지금은 필요한 버전 필드만 가져온 상황이고, 제공해주는 필드에는 description도 있고, 여러 정보가 있다!
aws cli를 이용하면 리소스의 버전 정보를 json형식으로 받을 수 있다.
go로 json넘겨 받기!
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("aws", "rds", "describe-db-engine-versions", "--engine", "mysql")
output, err := cmd.Output()
if err != nil {
fmt.Println("명령 실행 오류:", err)
return
}
fmt.Println("명령 실행 결과:")
fmt.Println(string(output))
}
물론, 내가 만든 리소스 목록도 불러 올 수 있다.
# vpc 목록 json으로
aws ec2 describe-vpcs --output json
# 필터도 가능(특정 vpc내에 내가 만든 subnet 목록)
aws ec2 describe-subnets --filters "Name=vpc-id,Values=<VPC ID>" "Name=tag:Key,Values=Value"
그냥 대부분의 받아 올 수 있는 정보는 다 받아 올 수 있는듯 하다. 덕분에 한시름 놓았다^^.