はじめに
前回の記事でAWS S3 Object Lambda(以下S3OL)についてコンソール上で設定し、動作させるところまで書きました。
その続編として今回は、前回の最後に書いた通り、S3OLをCloudFormation(以下Cfn)で定義しデプロイする...を行おうと思います。
なお今回も、デプロイ用のツールとして「Serverless Framework」を使用します。(ただし定義内容は生のCfn全く同じです。)
やること
- S3バケット&アクセスポイントの定義
- S3OLのアクセスポイントの定義
- デプロイ&コンソール確認
S3バケット&アクセスポイントの定義
まずはS3バケット、およびアクセスポイントの定義です。
とはいえ、これらはS3OLで追加された要素というわけではないので、説明はさらっと。(下記定義のコメントを参照)
// S3バケットの定義。 // ここは詳細な説明は省略。 SuzukimaS3ObjectLambdaBucket: { Type: 'AWS::S3::Bucket', Properties: { BucketName: 'suzukima-s3-object-lambda-serverless-bucket' } }, // S3アクセスポイントの定義 SuzukimaS3AccessPoint: { Type: 'AWS::S3::AccessPoint', Properties: { // 参照するリンク先バケット Bucket: { 'Ref':'SuzukimaS3ObjectLambdaBucket', }, // アクセスポイント名。 Name: 'suzukima-access-point-serverless', // ネットワークオリジン=VPCの場合、VpcIdに該当VPCのIDを設定する。 // 未指定時はネットワークオリジン=インターネットになる。 // "VpcConfiguration": { // "VpcId": xxxxxxxx // }, } },
S3OLのアクセスポイントの定義
で、次は肝心のS3OLのアクセスポイント定義です。
S3OLアクセスポイントの定義は、下記の公式ドキュメントに記載があります。
AWS::S3ObjectLambda::AccessPoint - AWS CloudFormation
なので、上記の公式ドキュメントをベースに定義を書いていくわけですが...
ContentTransformationの定義がない!
S3OLの設定の中に「ContentTransformation」という、S3OLとして起動するLambdaを設定する項目があるのですが、これについての公式ドキュメントの記載を見ると...
Type: Json
とだけ書いてあります。
「いや、そのJSONの中身が知りたいんですが」という話なんですが、この辺は今後修正されるんですかね?
一応、公式ドキュメントにもある通り、API Referenceページに項目が書いてありますので、それを元に定義を行えば大丈夫です。
最終的なS3OLの定義内容
というわけで、最終的なS3OLの定義内容は下記の通り。
各項目の定義は、下表で説明しています。(DependsOnは、デプロイ時に特に問題がなければ不要です)
SuzukimaS3ObjectLambdaAccessPoint: { Type: 'AWS::S3ObjectLambda::AccessPoint', DependsOn: ['S3UnderscoreobjectUnderscorelambdaLambdaFunction', 'SuzukimaS3AccessPoint'] Properties:{ Name: 'suzukima-s3-object-lambda-serverless', ObjectLambdaConfiguration: { AllowedFeatures: ['GetObject-Range', 'GetObject-PartNumber'], // S3アクセスポイントのARNは、RefやFn::GetAttでは取得できない。 SupportingAccessPoint: 'arn:aws:s3:ap-northeast-1:xxxxxxxxxxxx:accesspoint/suzukima-access-point-serverless', TransformationConfigurations: [{ Actions: ['GetObject'], ContentTransformation:{ AwsLambda:{ FunctionArn: { // S3UnderscoreobjectUnderscorelambdaLambdaFunctionは別途「functions」で定義しておく。(今回は省略) 'Fn::GetAtt':['S3UnderscoreobjectUnderscorelambdaLambdaFunction', 'Arn'], } } } }] } }, }
※S3OL.Propertiesの設定
項目名 | 説明 | 備考 |
---|---|---|
Name | S3OLの名前 | |
ObjectLambdaConfiguration | S3OLの詳細設定 | 下記「※ObjectLambdaConfigurationの設定」を参照 |
※ObjectLambdaConfigurationの設定
項目名 | 説明 | 備考 |
---|---|---|
AllowedFeatures | 許可されたfeatureの配列 | 現在は「GetObject-Range」および「GetObject-PartNumber」のみ有効 |
SupportingAccessPoint | S3OLに連携するS3アクセスポイントのARN | 「S3バケット&アクセスポイントの定義」で設定したS3アクセスポイントのARN |
TransformationConfigurations | S3OLで実行するLambda、およびS3イベントの詳細設定の配列 | 下記「※TransformationConfigurationsの設定」を参照 |
※TransformationConfigurationsの設定
項目名 | 説明 | 備考 |
---|---|---|
Actions | S3OLを実行するS3イベント | 現在は「GetObject」のみ有効 |
ContentTransformation | S3OLで実行するLambdaの設定 | 下記「※ContentTransformationの設定」を参照 |
※ContentTransformationの設定
項目名 | 説明 | 備考 |
---|---|---|
AwsLambda.FunctionArn | S3OLとして実際に実行するLambda関数のARN |
デプロイ&コンソール確認
ここまで出来たら、デプロイします。
特に問題がなければ、デプロイできるはずです。(エラーになったら設定を見直してください。特にDependsOnとかが追加で必要な場合もあります。)
ちなみに、上記設定でデプロイした場合、デプロイ後のコンソールは下記の状態になっています。(Lambdaの各種プロパティは、設定したLambda関数の設定がそのまま表示されます)
まとめ
以上、S3OLをCfnで定義しデプロイする方法でした。
最近はあまり話題にならない(てか、完全にCloudFront Functionsに話題をかっさらわれた感が否めない)S3OLですが、便利な機能ではあるので、Cfnを使用することで、少しでも楽になれば...と思います。
それでは、今回はこの辺で。(明日(5/11)から仕事...やだなあ)