AWS

VPC内に設置したLambdaからパラメータストアのSecureStringを取得

「Lambda からプライベートなサブネットにある Aurora を操作したいけど、DB の認証情報はパラメータストアにあるんだよね」

「単純に VPC 内に Lambda を設置して思い通りに動くのだろうか」

上記のようなパターンを Lambda で初めて構築する時は、未知数な部分があって悩みますよね。

VPC 外に Lambda を設置すると Aurora にアクセスできないし、VPC 内に設置するとパラメータストアに接続できないんじゃないかという不安です。

今回は、VPC 内に設置した Lambda からパラメータストアの暗号化文字列(SecureString)を取得してみます。

Lambdaに持たせる権限

冒頭でも書いた通り、Labmda には以下の条件を持たせようとしています。

・VPC 内に設置する
・パラメータストアを参照する
・プライベートなサブネットにある Aurora に接続する

VPC 内に Lambda を設置するには、AWS の公式ドキュメントにもある通り、「AWSLambdaVPCAccessExecutionRole」の IAM ポリシーが必要になります。

VPC 内にある Lambda 関数に、インターネットへのアクセス許可を付与する方法を教えてください

[アクセス許可ポリシーのアタッチ] の下で、AWSLambdaVPCAccessExecutionRole を検索します。その名前のポリシーを選択してから、[次へ: タグ] を選択します。

また、パラメータストアを参照するには、AWS Systems Manager 関連のポリシーを持たせておくと良さそうですね。

参照だけに限定するなら「AmazonSSMReadOnlyAccess」のポリシーが該当しますが、その中でさらに使用する API を限定してしまう方がセキュリティ的にはベターでしょうか。

ちなみに今回の場合は、以下の 2 つの API が使えれば事足りそうです。

よって、以下の 2 つの管理ポリシーを持った Lambda 実行用の IAM ロールを作成すれば OK です。

AWSLambdaVPCAccessExecutionRole
AmazonSSMReadOnlyAccess

Lambdaからパラメータストアにアクセスする

こちらも冒頭で書きましたが、VPC 内の Lambda からパラメータストアにアクセスするには、インターネットアクセスが必要になります。

よって Labmda は、NAT ゲートウェイや NAT インスタンスのあるサブネットに設置しなければいけません。

他にも方法はありますが、詳しくは IAM のところで紹介した公式ドキュメントを参照してください。

LambdaからAuroraにアクセスする

こちらは、Aurora と同じセキュリティグループに属していれば問題ありません。

パラメータストアから値を取得する

では実際に、python で書いた簡単な Lambda でパラメータストアにアクセスしてみましょう。

ちなみに、ssm.get_parameter で WithDecryption を True にしないと、暗号化文字列が複合化されないので注意が必要です。

最初、Decryption を Description と読み間違えていて、パラメータの説明項目なんていらないから False でいいだろうとミスっていたのは、何を隠そうこの私です(笑)

まとめ

VPC 内に設置した Lambda からパラメータストアを取得してみました。

サンプルに使用したのが python なので、pymysql をインポートすれば、このまま Aurora にも簡単に接続ができると思います。

Lambda なので、pip などでパッケージ管理して一緒に zip 化しないといかないのが面倒ですが、一度仕組みを作ってしまえば後は楽です。

pip で pymysql を追加する方法は以下の記事で書いてみたので参考にしてみてください。

MacにPython3.8をバイナリイメージからインストールする最近、MacBook Pro が何度か不調になり、移行アシスタントを使って代替の PC に移しました。 それもあってか、ローカルで...

python から Aurora の操作をする部分は、また別の機会に書いてみたいと思います。