忘備録φ(..)

仕事の日記。過去の自分に教えてあげたいこと

CloudFormationでLambdaをデプロイする

AWS認定 DevOpsエンジニア - プロフェッショナルを受験しようかなと考えていて、サンプル問題を解きました。

AWS-Certified-DevOps-Engineer-Professional_Sample-Questions.pdf

成績は3/10問、解説を読みながら「いやこの問題解けたな」と思ったものが2問だったので合格にはそれなりに勉強が必要そうです🙂

そのサンプル問題の(5)を実際に手を動かして確認したいなと思ったので簡単にコードを書きました。

reiichii/sample-lambda-cfn

以下復習した時のメモです。

問題

(5) DevOps エンジニアが、AWS Lambda 関数を記述し、この Lambda 関数を AWS CloudFormation テンプレートスニペット内で指定し (下記参照)、このテンプレートを Amazon S3 バケットに格納しました。

MyLambdaFunctionV1:
  Type:"AWS::Lambda::Function"
  Properties:
    Handler:"index.handler"
    Role:"arn:aws:iam::515290864834:role/AccountScanner"
    Code:
      S3Bucket:"johndoe-com-lambda-source"
      S3Key:"AccountScanner.zip"
    Runtime:"dotnetcore2.1"
    Timeout:60

CloudFormation スタックが作成され、Lambda 関数が想定どおりに動作しています。DevOps エンジニアは、関数コードの新バージョンを入手したので、スタック更新後すぐに新バージョンが実行されるようにしたいと考えています。

この要件を満たすには、どのように展開すればよいですか (3 つ選択してください)。

A) CloudFormation テンプレート内の Lambda 関数の論理名を MyLambdaFunctionV1 か ら MyLambdaFunctionV2 に変更し、CloudFormation スタックを更新する。

B) 既存の S3 バケットにおいてバージョニングを有効化する。新しいコードを既存の S3 バケットにアップ ロードする。CloudFormation テンプレート内の Lambda 関数の S3ObjectVersion プロパティで、S3 オ ブジェクトのバージョン ID を指定し、その後 CloudFormation スタックを更新する。

C) AWS SAM を使用して、sam deploy コマンドを CloudFormation テンプレートに対して発行し、Lambda 関 数のバージョンを更新する。

D) CloudFormation テンプレート内の Lambda 関数の S3 バケットプロパティ値を、別のバケット場所を指すよ う変更する。新しいコードを新しい S3 バケット場所にアップロードする。CloudFormation スタックを更新 する。

E) CloudFormation テンプレート内の Lambda 関数の S3Key プロパティ値を、別の場所および名前の .zip ファイルを指すよう変更する。新しいコードを新しい S3 バケット場所にアップロードする。その際、.zip ファイルの場所と名前を変更したことに留意する。その後、CloudFormation スタックを更新する。

F) サーバーレスフレームワークを使用して、serverless deploy function -f MyLambdaFunctionV1 コマンドを発行し、既存の Lambda 関数を更新する。

復習

正解

正解はB、D、E

B.以下のようにtemplate.ymlを変更します

      Code:
        S3Bucket: "{S3Bucket}"
        S3Key: "SampleLambda.zip"
        S3ObjectVersion: "{S3ObjectVersion}" # 追記

こうすることでソースコードの変更が検知され、該当部分の更新が行われるようになります。(cfnの変更セットのプレビューで以下のように確認できる)

f:id:reiichii:20210113092616p:plain

アクションがModifyになっていて、変更リソースはLambda function、置換がfalseとリソースの削除が伴わない変更なので「スタック更新後すぐに新バージョンが実行される」状態になっています。

D.上記のコードの S3Bucket 値を変更した形になります。このテンプレートに置き換えることによって上記の変更プレビューと同じような結果が得られます。

E.上記のコードの S3Key 値を変更した形になります。この変更でも上記の変更プレビューと同じような結果が得られます。

不正解

A.このやり方でスタックの更新を行うと、MyLambdaFunctionV1が削除されたのちMyLambdaFunctionV2が作成され、リソースの作り直しが行われます。(依存関係にあるリソースが削除されたりなど)

C.AWS SAMとはServerless Application Modelの略です。 AWSが提供しているサーバーレスアプリケーションのテンプレートのようなものだそうです。AWS SAMにはcliが提供されていて、コマンド2つほどでAPI Gateway × Lambdaの構成のアプリケーションがデプロイできるようでした。

私は全然知らなかったのですが、AWS SAMは他の問題文や解凍群の中にもちらほら登場していました。

今回の場合、AWS SAMで作られたものではないので、sam deploy コマンドでデプロイできるようにするためには作り直す必要がでてきます。

F.もCと同じく、serverlessを用いたものに作り直す必要があります。

おわりに

cfnもLambdaも触ったことはあったので、実際にものを作って動かしたらそんなに難しい問題ではなかったですね😅 自分なりに理解は深められたので良しとします。

実際に本番環境をこの組み合わせで管理することになったら、S3のバージョニングで管理するのが良さそうだなと思ったり。ソースコードはGitで管理することになると思うので。