はじめに
今回は AWS Secrets Manager を試します。
パスワードを自動生成して Lambda 上で参照します。
[Lambda関数・SAMテンプレート]
(https://github.com/tanaka-takurou/serverless-secrets-manager-page-go)
準備
[AWS Secrets Managerの資料]
AWS Secrets Manager
AWS SAM テンプレート作成
AWS SAM テンプレートで API-Gateway , Lambda, AWS Secrets Manager の設定をします。
[参考資料]
AWS SAM テンプレートを作成する
AWS Secrets Managerの設定は以下の部分
SampleSecret:
Type: AWS::SecretsManager::Secret
Properties:
GenerateSecretString:
GenerateStringKey: password
PasswordLength: 32
SecretStringTemplate: '{}'
IncludeSpace: false
ExcludeLowercase: false
ExcludeUppercase: false
ExcludeNumbers: false
ExcludePunctuation: true
Lambda関数作成
※ Lambda関数は aws-lambda-go を利用しました。
AWS Secrets Manager の操作は aws-sdk-go-v2/service/secretsmanager を利用しました。
Secrets Manager のデータを取得するには GetSecretValue を使う
func getSecret(ctx context.Context)(string, error) {
if secretsmanagerClient == nil {
secretsmanagerClient = secretsmanager.NewFromConfig(getConfig(ctx))
}
input := &secretsmanager.GetSecretValueInput{
SecretId: aws.String(os.Getenv("SECRET_ID")),
}
result, err := secretsmanagerClient.GetSecretValue(ctx, input)
if err != nil {
log.Print(err)
return "", err
}
resultJson, err := json.Marshal(SecretData{
SecretName: aws.ToString(result.Name),
SecretString: aws.ToString(result.SecretString),
CreatedDate: result.CreatedDate.Format(layout),
})
if err != nil {
log.Print(err)
return "", err
}
return string(resultJson), nil
}
終わりに
Secrets Manager のパスワードを自動生成し、Lambda上で参照出来るようにしました。
参考資料
[CloudFormationでパスワードを自動生成してテンプレート内で利用する](https://dev.classmethod.jp/articles/automatically-generate-a-password-with-cloudformation/)
【初心者】AWS Secrets Manager と AWS Systems Manager Parameter Store を使ってみる