Skip to Content

GolangでAWS Systems Managerパラメータストアを利用する

概要

AWS Systems Managerのパラメータストアに格納された値をGolangで取得するコード例

Systems Manager パラメータストア設定

パラメータ作成

SamplePrameterという名前で値(encryptStrings)を暗号化した状態で保存

完成!とても簡単

IAMロール

Systems Managerを参照しにいくので下記ポリシーは必要
AmazonSSMReadOnlyAccess

ECSで利用してるロールの例

Goでパラメータストアから値を取得

parameterNameにパラメータストア設定した名前を入れる
resにパラメータストアに格納されている値が返ってくる

ポイント

暗号化して値を保存しているので復号化する

1
		WithDecryption: aws.Bool(true),
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

import (
	"fmt"
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ssm"
)

const (
	REGION = "ap-northeast-1"
)

func main() {
	// parameterNameをパラメータストアから取得
	parameterName := "SamplePrameter"
	res, err := fetchParameterStore(parameterName)
	if err != nil {
		fmt.Println(res, err)
		os.Exit(0)
	}

	fmt.Println(res)
}

// パラメータストアから設定値取得
func fetchParameterStore(param string) (string, error) {

	sess := session.Must(session.NewSession())
	svc := ssm.New(
		sess,
		aws.NewConfig().WithRegion(REGION),
	)

	res, err := svc.GetParameter(&ssm.GetParameterInput{
		Name:           aws.String(param),
		WithDecryption: aws.Bool(true),
	})
	if err != nil {
		return "Fetch Error", err
	}

	value := *res.Parameter.Value
	return value, nil
}
実行結果

お目当ての値を取ってこれます

encryptStrings

エラー例

paramerterNameにパラメータストアに存在しない名前を入れた
具体的には頭のSを削った

1
parameterName := "amplePrameter"
実行結果

見つからないとエラーを返してくれます

Fetch Error ParameterNotFound: 
	status code: 400, request id: c0055d29-e029-4caf-bd2d-b332fb056932

感想

AWSに暗号化して保存している値を簡単に取り出すことができる
AWS DVAを勉強してパラメータストアを知ったので早速利用している
Fargateで動くコンテナがSQSからメッセージを取りに行く際のSQSのURLを保存したり、
Lambdaでスクレイピングする際のユーザ・パスワードを保存するのに現在利用中
環境変数で渡すよりセキュアで良いかなと
ロールはインラインポリシーでもっと絞れそうだけどリードオンリーで妥協してます

参考

https://qiita.com/kou_pg_0131/items/1eee0c46f478438aa115