🆕

AWS LambdaでJSON形式のリソースベースポリシーとブロックパブリックアクセスがサポートされます

2024/09/21に公開

偶然、嬉しいAWSアップデートを見つけました!

AWS LambdaでJSON形式のリソースベースポリシーとブロックパブリックアクセスが2024年10月1日からサポートされるようです。

これまでのLambdaのリソースベースのアクセス許可

これまでのLambdaのリソースベースのアクセス許可は、Lambda Permissionとも呼ばれるオプションによって設定でき、JSONではなくPrincipalSourceAccountなど一部の特定のプロパティを用いて指定する形式でした。

Type: AWS::Lambda::Permission
Properties:
  Action: String
  EventSourceToken: String
  FunctionName: String
  FunctionUrlAuthType: String
  Principal: String
  PrincipalOrgID: String
  SourceAccount: String
  SourceArn: String

AWS::Lambda::Permission - AWS CloudFormation

そのため、JSON形式のポリシーと比べ、細かな条件を使ったアクセス制御ができない難点がありました。

歴史的事情か分かりませんが、他の多くのAWSサービスではJSON形式のポリシーが使用されているのですから、Lambdaもそうなってくれないかなーと思っていました。

ついにJSON形式のリソースベースポリシーがサポート

9月17日のAPIアップデートで、LambdaにおけるJSON形式のリソースベースポリシーのサポートが案内されていることを発見しました。APIの変更としては、新規に5つのAPIメソッドが公開されることになります。同時に、ブロックパブリックアクセス設定のサポートも案内されています。

2024/09/17 - AWS Lambda - 5 new api methods

Changes Support for JSON resource-based policies and block public access

  • PutResourcePolicy (new)
  • PutPublicAccessBlockConfig (new)
  • GetResourcePolicy (new)
  • DeleteResourcePolicy (new)
  • GetPublicAccessBlockConfig (new)

https://awsapichanges.com/archive/changes/c7615e-lambda.html

現時点では、どうやら一部のリージョンのみにこの変更がリリースされているようです。APIリファレンスを見ると以下のとおり注意書きされており、10月1日からすべてのリージョンで利用可能になることが読み取れます。

The option to create and modify full JSON resource-based policies, and to use the PutResourcePolicy, GetResourcePolicy, and DeleteResourcePolicy APIs, won't be available in all AWS Regions until September 30, 2024.

PutResourcePolicy - AWS Lambda

The option to configure public-access settings, and to use the PutPublicAccessBlockConfig and GetPublicAccessBlockConfig APIs, won't be available in all AWS Regions until September 30, 2024.

PutPublicAccessBlockConfig - AWS Lambda

現時点で利用可能なリージョンを探してみたところ、アイルランドリージョン(eu-west-1)では利用可能であることを確認しました。

コンソールを見てみる

アイルランドリージョンでLambda関数の「設定」→「アクセス権限」を見ると、「Public access settings」が追加されており、さらに「リソースベースのポリシーステートメント」で「編集」を選択するとJSONポリシーが作成できるようになっていることが確認できます。なお、引き続き「Add individual permissions」から従来型のアクセス権限の追加もできるようです。

ブロックパブリックポリシーの設定がブロックである場合、JSONポリシーまたは従来のアクセス権限で任意のプリンシパル(Principal: *)に対するアクセス許可を追加しようとすると、以下のエラーが表示され追加できないことが確認できます。このあたりは、S3のブロックパブリックポリシー/アクセス設定と同様の機能であると思います。

Lambda blocked the creation of this policy because it would grant public access to your function. If this is intentional, change your function's BlockPublicPolicy setting to allow public access and try again.

CloudFormationの対応状況

9月21日現在、AWS::Lambda::Permissionの注意書きとしてAWS::Lambda::ResourcePolicyという文字列が見られます。AWS::Lambda::ResourcePolicyのページ自体はまだ存在しないようですが、公開されるのも時間の問題かと思います。

To grant permissions to access your function, you can also use the AWS::Lambda::ResourcePolicy resource. This resource adds a complete JSON resource-based policy to a function.

Using both the AWS::Lambda::Permission and AWS::Lambda::ResourcePolicy resources to set permissions on a function, either in a single AWS CloudFormation stack or across multiple stacks, can result in errors, and permissions defined in the AWS::Lambda::Permission resource can be unintentionally overwritten. Don't use both resource types to set permissions on a function.

We recommend using the AWS::Lambda::ResourcePolicy resource to set access permissions. This resource gives you more flexibility and fine-grained control than AWS::Lambda::Permission. To migrate existing permissions for a function from AWS::Lambda::Permission to AWS::Lambda::ResourcePolicy, do the following: ...

AWS::Lambda::Permission - AWS CloudFormation

あとがき

特にJSONポリシーのサポートについては、個人的に待望のアップデートです!

引き続き従来の、いわゆるLambda Permissionによるアクセス制御もできるようですが、柔軟性や、他のAWSサービス群との一貫性を考えても、JSONポリシーを使用していくのが良いと思います。

ブロックパブリックアクセスのサポートについては、セキュリティ面の強化となりますが、関数を公開する際には要考慮事項となりますので十分注意が必要です。

CloudFormationの対応もすでに準備中のようで良かったです。

Discussion