AWS 리소스 옵션 불러오기

강다·2023년 6월 11일
0

OIDC 출전작인 Terraform Canvas 사전공부 중에 리소스 옵션의 정보가 많은 항목에 대해서 어떻게 처리할지에 대한 내용이다. 예를 들어, 콘솔에서 ec2를 생성한다고 할 때 인스턴스 타입에 많은 종류가 있는데 이걸 사용자에게 토글로 제공해주고싶다. 이럴 때 해당 정보들을 어떻게 받아올까.. 하다가 sdk가 우리가 사용예정 언어인 Go로 잘 나와있다고 해서 사용해 보려고 한다.
AWS CLI로도 받아와 봤는데 쿼리가 잘 안 되는 것 같아서 sdk-go로 진행하기로 했다!

https://github.com/aws/aws-sdk-go


예시로 rds-mysql 버전 목록 불러와봤다.

1. aws-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도 있고, 여러 정보가 있다!

2. AWS CLI 이용하기(이러면 필요한 필드 추출은 결국 go에서 다시 해야함)

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"

그냥 대부분의 받아 올 수 있는 정보는 다 받아 올 수 있는듯 하다. 덕분에 한시름 놓았다^^.

0개의 댓글