業務で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のテストを実行して、パラメータストアから値が取得できれば成功。