echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【AWS】Amazon S3 Object Lambdaを試してみた(その2)

はじめに

前回の記事でAWS S3 Object Lambda(以下S3OL)についてコンソール上で設定し、動作させるところまで書きました。

その続編として今回は、前回の最後に書いた通り、S3OLをCloudFormation(以下Cfn)で定義しデプロイする...を行おうと思います。

なお今回も、デプロイ用のツールとして「Serverless Framework」を使用します。(ただし定義内容は生のCfn全く同じです。)

www.serverless.com

やること

  • 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関数の設定がそのまま表示されます)

f:id:Makky12:20210509173451p:plain

f:id:Makky12:20210509173700p:plain

まとめ

以上、S3OLをCfnで定義しデプロイする方法でした。

最近はあまり話題にならない(てか、完全にCloudFront Functionsに話題をかっさらわれた感が否めない)S3OLですが、便利な機能ではあるので、Cfnを使用することで、少しでも楽になれば...と思います。

それでは、今回はこの辺で。(明日(5/11)から仕事...やだなあ)