AWS SDK Go v2を使ってパラメータストアから値を取得してみた

備忘録
この記事は約6分で読めます。

業務でAWS SDK Go v1からv2に乗り換えの話が出てきたので、AWS SDK Go v2を使ってパラメータストアから値を取得してみた。

環境情報

  • OS:macOS Sonoma
  • エディタ:VSCode
  • Golang:1.22.2

補足:環境をなるべく汚したくないので、Dockerで作業用のコンテナ用意して作業してる。

前提条件

すでに、golangを実行する環境、Lambdaの関数作成が整っていること。

プロジェクト構成

AWS-SDK-GO-V2-SSM/
├── ssmTest/
│ └── docker/
│     └── dockerfile
├── src/
└── docker-compose.yml

今回のソースはgithubにあげてあるんで興味ある方はどうぞ。

ソースはみんな大好きChatGPTでソースを生成してもらった。

作成してもらったソースを一部修正。

package main

import (
	"context"
	"log"

	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/ssm"
)

// リクエストの構造体
type MyEvent struct {
	ParamName string `json:"param_name"` // リクエスト時にパラメータ名を指定する
}

// レスポンスの構造体
type MyResponse struct {
	ParamValue string `json:"param_value"`
}

// ハンドラー関数
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error) {
	// SDK設定のロード
	cfg, err := config.LoadDefaultConfig(ctx)
	if err != nil {
		log.Fatalf("unable to load SDK config, %v", err)
		return MyResponse{}, err
	}

	// SSMクライアントの作成
	ssmClient := ssm.NewFromConfig(cfg)

	// パラメータの取得
	paramInput := &ssm.GetParameterInput{
		Name: aws.String("test"),
	}

	result, err := ssmClient.GetParameter(ctx, paramInput)
	if err != nil {
		log.Printf("failed to get parameter, %v", err)
		return MyResponse{}, err
	}

	log.Printf(*result.Parameter.Value)

	// レスポンスを作成して返す
	return MyResponse{
		ParamValue: *result.Parameter.Value,
	}, nil
}

func main() {
	// Lambdaハンドラーの開始
	lambda.Start(HandleRequest)
}


作成したソースをLambdaにデプロイ。

デプロイ方法

AWS System Managerからパラメータストアの作成で以下の内容で入力、作成。

名前:test

値:なんでもいい(例:これはテストです。)

Lambdaの実行ロールにパラメータストアを参照できるようにポリシー追加。

これやらないとパラメータストア参照できなくて、Lambdaがコケる。

Lambdaの設定タブ内にある「アクセス権限」にあるロール名を選択。

許可ポリシー内のポリシー名「AWSLambdaBasicExecutionRole-xxxxxxxxxxxxxxxxxxxxx」を選択。

xxxxxxxxxxxxxxxxxxxxxは英数字の組み合わせが入ってる。

許可タブないの「編集」を選択。

Statementタグ内に以下の内容を入力。

「us-west-2」はリージョンによって変わる。

「xxxxxxxxxxx」はアカウントID

{
			"Effect": "Allow",
			"Action": "ssm:GetParameter",
			"Resource": "arn:aws:ssm:us-west-2:xxxxxxxxxxx:parameter/test"
		},

追加すると全体のjsonはこんな感じ。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "ssm:GetParameter",
			"Resource": "arn:aws:ssm:us-west-2:xxxxxxxxxxx:parameter/test"
		},
		{
			"Effect": "Allow",
			"Action": "logs:CreateLogGroup",
			"Resource": "arn:aws:logs:us-west-2:xxxxxxxxxxx:*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"logs:CreateLogStream",
				"logs:PutLogEvents"
			],
			"Resource": [
				"arn:aws:logs:us-west-2:xxxxxxxxxxx:log-group:/aws/lambda/ssmTest:*"
			]
		}
	]
}

「次へ」選択後、サービスに「Systems Manager」が追加されていれば問題ない。

Lambdaのテストを実行して、パラメータストアから値が取得できれば成功。

タイトルとURLをコピーしました