😽

AmplifyのLambdaからssmの値を取得する時のエラー

2023/02/24に公開

概要

Amplifyで作成したLambdaからssmのパラメーターストアの値を取得しようとした時に発生したエラーの解決が少し大変だったのでメモ。
結論としては Amplify で作成した Lambdaの実行環境での環境変数が想定していたものではなかったので、実行時に無理やりcredentialsを設定するようにしました。

環境

macOS Ventura バージョン 13.2(22D49)
golang
https://github.com/aws/aws-sdk-go/tree/main/service/ssm

エラー内容

Lambdaでssmを呼び出した時に失敗しており、cloudWatchでは以下のエラーを吐いていました。

NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors

文面からするとCredentialProvidersが見つかってないようでした。
ローカルでは.aws/credentialsの中のアクセスキーを参照しています。

ローカルでは動いてたのでCredentialsの取得の仕組みがローカルと実際の実行環境で違うようです。
作成する際に参考にしていた記事ではcredentialsを実行環境でどうこうする記載は特になかったのでaws側でいい感じにしてくれるのだと思ってました。

環境変数のAWS_ACCESS_KEYを参照しているようなので以下のコードを入れて出力すると、ローカルと実際の実行環境でアクセスキーが同一ではありませんでした。

    var access_key_id = os.Getenv("ACCESS_KEY_ID")
    var secret_access_key = os.Getenv("SECRET_ACCESS_KEY")
    fmt.Println(access_key_id)
    fmt.Println(secret_access_key)

アクセスキーはIAMユーザーに紐づいているはずで、実際の実行環境で取得したアクセスキーは所持するどのiamユーザーのものでもありませんでした。(謎)
また、Lambdaに割り当てられた実行ロールのアカウントidはamplifyユーザーのものでした。
IAMで設定されてないアクセスキーが環境変数に入ることなんてあるんでしょうか。

とはいえLambdaからssmへはアクセスキー経由でアクセスしてることに変わりはないと思うので、実行環境での環境変数を変更しようとしました。
が、AWS_SECRET_ACCESS_KEYとAWS_ACCESS_KEY_IDはLambdaのコンソールから変更できない使用でした。
なので別名で実行環境の環境変数にセットして、ssmにアクセスする際は別名のアクセスキーを読み込んで取得する方針にしました。
結果うまく取得出来ました。

変更前

// 前略
const (
 REGION  string = "ap-northeast-1"
 PROFILE string = "amplify-gpt3-user"
)

// パラメータストアから設定値取得
func FetchParameterStore(keyName string) (string, error) {
 sess, _ := session.NewSessionWithOptions(session.Options{
  Config:  aws.Config{Region: aws.String(REGION)},
  Profile: PROFILE,
 })

 svc := ssm.New(sess,aws.NewConfig().WithRegion("ap-northeast-1"))

 //後略
 }

変更後

 sess, _ := session.NewSessionWithOptions(session.Options{
  Config:  aws.Config{Region: aws.String(REGION)},
  Profile: PROFILE,
 })
 var access_key_id = os.Getenv("ACCESS_KEY_ID")
 var secret_access_key = os.Getenv("SECRET_ACCESS_KEY")
 // fmt.Println(access_key_id)
 // fmt.Println(secret_access_key)

 creds := credentials.NewStaticCredentials(access_key_id, secret_access_key, "")

 svc := ssm.New(sess,
  aws.NewConfig().WithRegion("ap-northeast-1").WithCredentials(creds),
 )

今後の課題

実行環境でアクセスキーがどのように設定されるのかについての知識がまだたりてないのでそれについても調べてみようと思います。
Lambdaの作成過程が良くなかったのか、プロファイルの設定が良くなかったのかなど。
順当に行けば後からcredentialsを環境変数に設定し直す、なんてことをしなくてもいいはず?

Discussion