AWS LambdaでJSON形式のリソースベースポリシーとブロックパブリックアクセスがサポートされます
偶然、嬉しいAWSアップデートを見つけました!
AWS LambdaでJSON形式のリソースベースポリシーとブロックパブリックアクセスが2024年10月1日からサポートされるようです。
これまでのLambdaのリソースベースのアクセス許可
これまでのLambdaのリソースベースのアクセス許可は、Lambda Permissionとも呼ばれるオプションによって設定でき、JSONではなくPrincipal
やSourceAccount
など一部の特定のプロパティを用いて指定する形式でした。
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.
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.
現時点で利用可能なリージョンを探してみたところ、アイルランドリージョン(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
andAWS::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 theAWS::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 thanAWS::Lambda::Permission
. To migrate existing permissions for a function fromAWS::Lambda::Permission
toAWS::Lambda::ResourcePolicy
, do the following: ...
あとがき
特にJSONポリシーのサポートについては、個人的に待望のアップデートです!
引き続き従来の、いわゆるLambda Permissionによるアクセス制御もできるようですが、柔軟性や、他のAWSサービス群との一貫性を考えても、JSONポリシーを使用していくのが良いと思います。
ブロックパブリックアクセスのサポートについては、セキュリティ面の強化となりますが、関数を公開する際には要考慮事項となりますので十分注意が必要です。
CloudFormationの対応もすでに準備中のようで良かったです。
Discussion