AWS Lambda

AWS SAM Accelerate試しに使ってみた


概要

こんにちは、テクニカルサポートの牛山です。

今回は、SAM機能でバブリックプレビューされました「AWS SAM Accelerate」を使用してみたという記事になります。

「AWS SAM Accelerate」は、ローカルでインフラストラクチャをエミュレートしていたものを、クラウド上に開発環境としてデプロイし、テストを効率化するための機能となります。

リアルタイムでコード変更を監視し、実行時のログ内容をリアルタイムで表示させることができます。

サーバレス開発ではローカルでのエミュレートが複雑になる場合がありましたが、クラウド上でテストすることによりインフラの制度を高めることができます。

前提条件

  • AWS SAMコマンドをインストール済みであること。
  • AWS CLI IAMユーザをセットアップ済みであること。
  • AWS CLI認証情報を設定済みであること。

環境

  • Amazon Linux release 2 (Karoo)
ツール名 バージョン
Python 3.9.0
SAM CLI 1.35.0
aws-cli 2.4.0

プロジェクト作成

hello-worldチュートリアルプロジェクト使用し、EC2のリストを表示するものへ変えていきます。

sam init --app-template hello-world --name sam-tutorial --package-type Zip --runtime python3.9

プロジェクトを作成すると、以下のようなディレクトおよびファイルが生成されます。

今回さわるのは、 app.pytemplate.yaml を編集していくことになります。

tree sam-tutorial

sam-tutorial
├── events
│   └── event.json
├── hello_world
│   ├── app.py
│   ├── __init__.py
│   └── requirements.txt
├── __init__.py
├── README.md
├── template.yaml
└── tests
    ├── __init__.py
    ├── integration
    │   ├── __init__.py
    │   └── test_api_gateway.py
    ├── requirements.txt
    └── unit
        ├── __init__.py
        └── test_handler.py

デプロイおよび追跡

sam sync --watch コマンド使用し、AWS SAMにファイルの変更を監視させ、変更が検出された場合、自動的にクラウドと同期するようになります。

※sam deployコマンドと同様にすべてのインフラストラクチャとコードをクラウド上にデプロイまたは更新します。

sam sync --watch --stack-name sam-app

実行するとβ機能であることと、syncコマンドは開発スタックにのみ使用してくださいという注意書きが出力され、β機能を有効にするか確認のため、質問されます。

今回、有効にしたいので、 yes とタイプしてEnterしてください。

その後、CloudFormationスタックにより、Lambda関数やApiGateway等のリソースが作成されます。

CloudFormation outputs from deployed stack項目、HelloWorldApi項目にApiGatewayのURLが出力されます。

Stack creation succeeded. Sync infra completed. および Infra sync completed. と出力されることを確認します。

コマンドは、ターミナルを奪うので、ターミナルを消さずに、新規ターミナルセッションを作成します。

リアルタイムログをターミナル上で有効化

すでにあるsam logsコマンドの強化版でAPI GatewayのログやAWS X-Rayからのトレースし画面上に出力させることが以下コマンドで可能となります。

sam logs --stack-name sam-app --include-traces --tail

こちらも、β機能であることが出力されコマンドを続行するか問われるので、 yes とタイプしてEnterしてください。

先ほど作成した、ApiGatewayのURLにアクセスします。

アクセスするとブラウザ上に {"message": "hello world"} と出ます。

リアルタイムログターミナル上で確認すると、Lambdaを実行した際にCloudWatch Logsへ出力されるログ情報がリアルタイムでターミナル上に出力されつことを確認できます。

コマンドは、ターミナルを奪うので、ターミナルを消さずに、新規ターミナルセッションを作成します。

EC2インスタンスデプロイ

EC2のリストを表示させたいので、テンプレートファイルに、EC2デプロイ設定を記述します。

Resources: セクション配下へ記載するようにします。

リファレンス:AWS SAMテンプレートの構造

リファレンス:Amazon Elastic Compute Cloud resource type reference

diff -u template.yaml.org template.yaml

--- template.yaml.org   2021-11-23 04:52:37.192821433 +0900
+++ template.yaml       2021-11-23 06:41:52.738453504 +0900
@@ -25,6 +25,19 @@
           Properties:
             Path: /hello
             Method: get
+  HelloWorldEC2:
+    Type: AWS::EC2::Instance
+    Properties:
+      ImageId: ami-0e60b6d05dc38ff11 # Amazon Linux 2 AMI (HVM) aws ssm get-parameter --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region ap-northeast-1
+      InstanceType: t3.nano
+      AvailabilityZone: ap-northeast-1a # 作成済みのものを指定します。
+      SubnetId: subnet-xxxx # 作成済みのものを指定します。
+      KeyName: "xxxx" # 作成済みのものを指定します。
+      BlockDeviceMappings:
+      - DeviceName: "/dev/xvda"
+        Ebs:
+          VolumeSize: 8
+          VolumeType: "gp2"

 Outputs:
   # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function

デプロイおよび追跡ターミナルセッションで Stack creation succeeded. Sync infra completed. および Infra sync completed. と出力されることを確認します。

Lambda IAM Role権限付与

Lambda IAM RoleからEC2リストを表示できるようにするため、EC2の読み取り権限を付与します。

Resources: -> HelloWorldFunction: セクション配下に Policies: へ設定します。

diff -u template.yaml_ec2 template.yaml

--- template.yaml_ec2   2021-11-23 06:41:52.738453504 +0900
+++ template.yaml       2021-11-24 05:52:09.543677670 +0900
@@ -25,6 +25,8 @@
           Properties:
             Path: /hello
             Method: get
+      Policies:
+        - arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
   HelloWorldEC2:
     Type: AWS::EC2::Instance
     Properties:

デプロイおよび追跡ターミナルセッションで Stack creation succeeded. Sync infra completed. および Infra sync completed. と出力されることを確認します。

app.pyへEC2リスト表示処理追加

hello_world/app.py にある、pythonファイルを編集します。

処理内容は以下となります。

EC2のAPIを叩いて、EC2に設定されているタグ情報を表示する内容となります。

diff -u hello_world/app.py.org hello_world/app.py

--- hello_world/app.py.org      2021-11-23 04:52:37.197821430 +0900
+++ hello_world/app.py  2021-11-22 16:26:07.670920678 +0900
@@ -1,4 +1,6 @@
+import datetime
 import json
+import boto3

 # import requests

@@ -33,10 +35,26 @@

     #     raise e

+    print("Invoking the updated function!")
+
+    data = [ ]
+    my_client = boto3.client( 'ec2' )
+    ec2_describe_instances_dict = my_client.describe_instances( )
+    #ec2_describe_instances_dict = event
+
+    print( '----------------------' )
+    print( datetime.datetime.now( ) )
+
+    for reservations in ec2_describe_instances_dict[ 'Reservations' ]:
+        for instances in reservations[ 'Instances' ]:
+            for tags in instances[ 'Tags' ]:
+                data.append( tags[ 'Value' ] )
+                print( tags[ 'Value' ] )
+
     return {
         "statusCode": 200,
         "body": json.dumps({
-            "message": "hello world",
+            "message": str( data ),
             # "location": ip.text.replace("\n", "")
         }),
     }

変更を保存すると即座にクラウド上のLambda関数と同期されます。

動作確認

APIゲートウェイのURLにアクセスすると、ブラウザ上に {"message": "['HelloWorldEC2', 'sam-app', 'arn:aws:cloudformation:ap-northeast-1:************:stack/sam-app/f014c810-4bcf-11ec-9749-0a3950af64f5']"} と出力され、無事に取得できていることが確認できます。

リアルタイムログターミナル上で確認すると、Lambdaを実行した際にCloudWatch Logsへ出力されるログ情報がリアルタイムでターミナル上に出力されることを確認できます。

後片付け

最後に作成したリソースの削除を実施します。

sam delete --stack-name sam-app

Deleted successfullyとなれば問題ありません。

他、aws-sam-cli-managed-default スタックや、CloudWatchLogsのログが残ってしまっているので適宜、マネージメントコンソールから削除を実施してください。

※EC2キーペアの削除が必要であれば実施してください。

        Are you sure you want to delete the stack sam-app in the region ap-northeast-1 ? [y/N]: y
        Do you want to delete the template file 03ddef688595a94c949e6c8f76df1049.template in S3? [y/N]: y
        - Deleting S3 object with key 9bc1c3cafbe33e60e22e60cd9faace55
        - Deleting S3 object with key 2bf487d5fbd5d19e56c26fcda84adc06.template
        - Deleting S3 object with key 03ddef688595a94c949e6c8f76df1049.template
        - Deleting Cloudformation stack sam-app

Deleted successfully

まとめ

AWS SAM Accelerate機能便利ですよね。

開発速度が上がりそうです。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA