[アップデート] VPC 外の Lambda 関数を作らせない! AWS Lambda に VPC 設定に関する IAM 条件キーが追加されました!

VPC 内 Lambda を使用する際に VPC 設定に応じた制御を行いやすくなりました。

コンバンハ、千葉(幸)です。

AWS Lambda において、VPC 設定に関する IAM 条件キーが追加されました!

VPC 外 Lambda を作成させたくない、などのケースにおいて、IAM ポリシーによる制御を実現できるようになりました。

目次

何が変わったのか

Lambda 関数は、デフォルトでは AWS が管理するネットワーク上に作成されます。カスタマーが管理する VPC 上のリソースにアクセスさせたい場合、 Lambda 関数を VPC 接続可能な形にセッティングすることができます。俗に VPC 内 Lambda と呼ばれます。

実態としては、カスタマーが管理する VPC 上に ENI が作成され、そこを経由して AWS 管理の VPC 上で稼働する Lambda 関数が通信を行うような形となります。


(冒頭のブログより画像引用)

VPC 内 Lambda を作成する場合、関連付ける先の VPC およびサブネットや、ENI にアタッチするSecuriryGroup を指定することになります。

IAM の条件キーとしてそれらのリソース ID を指定できるようになったため、「特定のサブネットにのみ関連づけ可能」「特定の SecuriryGroup は指定不可」「 VPC に関連づける場合のみ Lambda 関数の作成可能」といった制御を行うことが可能になりました。

Lambda 関数に割り当てる権限を誤って強すぎるものにしてしまった場合に備えて、Lambda 関数は全てVPC 内 Lambda としたい、といったセキュリティポリシーが定められている環境もあるかと思います。

そういった環境においては、 VPC 外 Lambda を禁止する、という設定ができるのは助かりますね。

加えて、VPC 内 に収めつつ、関連づけるサブネットや SecuriryGroup も特定のものに限定する、といった制御もできます。これまでは IAM ポリシーによるシステマチックな制御は実現できなかったため、嬉しいアップデートでしょう。

追加された条件キー

今回のアップデートで追加された条件キーは以下の 3 つです。

  • lambda:VpcIds
  • lambda:SubnetIds
  • lambda:SecurityGroupIds

これらの詳細は以下のページ確認できます。(現時点では英語版のみに情報反映)

Actions, Resources, and Condition Keys for AWS Lambda - AWS Identity and Access Management

上記の条件キーを指定できるアクションは、現時点で以下の 2 つのみです。

  • CreateFunction
  • UpdateFunctionConfiguration

ユースケース

こちらも現時点で英語版でのみ記載がアップデートされていますが、今回追加された条件キーを使用したポリシーの例が以下に載っています。

Configuring a Lambda function to access resources in a VPC - AWS Lambda

  • VPC 内 Lambda のデプロイのみを許可する
  • 特定の VPC、サブネット、SecuriryGroup への関連づけを拒否する
  • 特定の VPC、サブネット、SecuriryGroup への関連づけのみを許可する

例えば、特定の SecuriryGroup (sg-1,sg-2 ) を関連づける場合のみ、 Lambda 関数の作成・更新を許可する、といったケースを実現するためのポリシー例は以下です。

{
      "Sid": "EnforceStayInSpecificSecurityGroup",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
            "lambda:SecurityGroupIds": ["sg-1", "sg-2"]
        }
      }
    }
  ]
}

(この例では ForAllValues が使用されているため、 sg-1 と sg-2 の両方が指定されている必要があります。)

複数のキーまたは値による条件の作成 - AWS Identity and Access Management

やってみた

今回は上記ページのサンプルを利用して、「 VPC 内 Lambda のみ作成・更新可能」という挙動を試していきます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceVPCFunction",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
           "lambda:VpcIds": "true"
        }
      }
    }
  ]
}

NULL 条件演算子を使用して、リクエストの中に lambda:VpcIds が含まれているかを確認し、存在しなければ VPC 外 Lambda であるため拒否するというものです。

IAM JSON ポリシーエレメント: 条件演算子 - AWS Identity and Access Management

なんでもできる AdministratorAccess がアタッチされているものの、上記のポリシーにより一部のアクションが Deny された状態の IAM ロールで操作してみます。

Lambda 関数の作成

以前は Lambda 関数の作成時にあわせて VPC 接続の設定もできたような気がしますが、現時点で試した限りではマネジメントコンソールでは設定できる箇所がありませんでした。

ひとまずそのまま作成を試みます。

VPC 内 Lambda でない限り拒否する、というポリシーが設定されているため、エラーが発生します。

User: xxxxxxxxx is not authorized to perform: lambda:CreateFunction on resource: arn:aws:lambda:ap-northeast-1:000000000000:function:zzzzzzzzz with an explicit deny

作成の段階から VPC 接続の設定を行いたい場合、以下のように AWS CLI などで実行する必要があります。

aws lambda create-function --function-name MyVPCLambda1 \
  --vpc-config "SubnetIds=['subnet-019c87c9b67742a8f'],SecurityGroupIds=['sg-0a56588b3406ee3d3']" \
  --runtime python3.7 --handler helloworld.handler --zip-file fileb://vpccondition.zip \
  --region us-east-1 --role arn:aws:iam::123456789012:role/VPCConditionLambdaRole

詳細は以下のブログを参照してください。

Using AWS Lambda IAM condition keys for VPC settings | AWS Compute Blog

Lambda 関数の更新

これだけだとなんなので、すでに VPC 内 Lambda となっているものを編集して VPC 外 Lambda とする、という操作も試してみます。

上記の Deny ポリシーを外した状態で VPC 内 Lambda を作成しました。関連づける VPC 、サブネット、SecuriryGroup が定義されている状態です。

操作する IAM ロールには再度 Deny のポリシーを設定しました。上記画面右上の [ 編集 ] を押下して編集画面に遷移し、 VPC 接続 を「なし」に切り替えてから [ 保存 ] を押下します。

権限不足によるエラーが表示されました。

次のことを実行する権限がありません: lambda:UpdateFunctionConfiguration.

作成だけでなく、更新の操作も制御できることが確認できました!

終わりに

AWS Lambda における、 VPC 接続に関する設定を制御する条件キーが追加されたことを確認しました。

従来は VPC 内 Lambda に関しては「起動までに時間がかかる」といった難点がありましたが、2019年に AWS Hyperplane の機能を利用したアーキテクチャに変更され、大幅に速度が改善されました。

また、最近 GA となった RDS Proxy によって、VPC 内 Lambda のユースケースは増えているかと思います。

存在感を増す VPC 内 Lambda について、より柔軟な制御を行いながら活用していきましょう。

以上、千葉(幸)がお送りしました。