SAMを使ってテンプレートからサーバーレスな環境を構築する(その④-SAM CLI)

AWSのホームページの初心者ハンズオンにある「SAMを使ってテンプレートからサーバーレスな環境を構築する 」の内容を自分のAWSアカウントでやってみました。

ハンズオンではAWSホームページで、10本の Youtube-video でもって、翻訳 Web API を AWS Serverless Application Model (AWS SAM) を用いてテンプレートからシステムを構築します。
( 翻訳 Web API はハンズオンシリーズの前回取り扱い分 )

  • SAMの概説とCloud9を使った準備作業
  • 小手調べでSAMを使って、「Hello Hands on world!」Lambdaを作った後、SAMでTranslate機能をLambda関数として追加して、IAMも許可する
  • API Gateway を構成に追加後、DynamoDBにログを書き込むようにLambda関数を連携させる
  • SAM CLIも使ってみる。最後にリソースを削除する。

今回の投稿は4パート目で、SAM CLI を使ってみて、最終的にリソースの後始末(削除)をします。

SAMを使ってテンプレートからサーバーレスな環境を構築する

SAM CLI を使ってみる

AWS SAM Command Line Interface (CLI)とは?

AWS SAM をローカル環境で実行するために、便利な機能を提供するCLI
(Dockerインストールが必要)

■テンプレートを使って、サーバアプリケーションを対話形式で初期化 ■

 sam init

■ ローカル環境でビルド ■

 sam build

■ AWS環境へデプロイ ■

 sam deploy –guided

■ SAMテンプレートの事前検証 ■

 sam validate

■ LambdaローカルエンドポイントやAPIエンドポイントを起動し、実行テスト可能 ■

 sam local start-lambda / start-api

AWS SAM CLI インストール

SAM CLI のインストールについては、「sam cli install」で検索して見る。

AWS SAM CLI インストール
AWSドキュメントで AWS SAM CLI を調べる

ステップ 1: AWS アカウントを作成する
ステップ 2: IAM 許可と AWS 認証情報を設定する
ステップ 3: Docker をインストールする (オプション)

以上までは、Cloud9の環境では適用済み

ステップ 4: AWS SAM CLI をインストールする  から実施していく。

1.AWS SAM CLI zip ファイルを任意のディレクトリにダウンロードします。

   wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip

2.以下のコマンドを使用してハッシュ値を生成することによって、ダウンロードしたインストーラファイルの
  整合性と信頼性を検証します。

   miko:~/environment $ sha256sum aws-sam-cli-linux-x86_64.zip
   c149433bf12104b82c814fdfc1a83fb291672d771214aa0ff73652169c8f5ca0  aws-sam-cli-linux-x86_64.zip

   ※ https://github.com/aws/aws-sam-cli/releases/tag/v1.35.0 にある、ハッシュ値で確認する。
ハッシュ値を確認

3.インストールファイルを sam-installation/ サブディレクトリに解凍します。

   unzip aws-sam-cli-linux-x86_64.zip -d sam-installation

4.AWS SAM CLI をインストールします。

   miko:~/environment $ sudo ./sam-installation/install

   Found preexisting AWS SAM CLI installation: /usr/local/aws-sam-cli/current. Please rerun install script with --update flag.

5.インストールを確認します。

   miko:~/environment $ sam --version

   SAM CLI, version 1.33.0

※ 上記、AWSドキュメントにアップグレードとアンインストールの仕方も載っている

テンプレートを使って、サーバアプリケーションを対話形式で初期化

下記コマンド実行の結果

template.yaml
app.py

が出来上がっている。

sam init でコマンド起動

1 – AWS Quick Start Templates

1:ZIP形式で指定した

Python3.7 にした。
※ Python3.9は、AWS SAM CLI
  のサポート対象外(2021.11.20)

プロジェクト名はデフォルト「sam-app」にした。(ENTERをクリック)

1 – Hello World Example を指定

ローカル環境でビルド

以下のコマンドを投入

miko:~/environment $ cd sam-app
miko:~/environment/sam-app $ sam validate
(SAMテンプレートの事前検証)
miko:~/environment/sam-app $ sam build

※ Python3.9 ではここで失敗する。

AWS環境へデプロイ

sam deploy –guided を投入

sam deploy –guided

Stack Name は「sam-app」のまま(ENTER をクリック)
リージョンは東京のまま(ENTER をクリック)
変更点を確認してからデプロイする(y を入力)
SAMに必要なIAMロールを追加するか(y を入力)

samconfig.toml に設定内容を保存するか(y を入力)

変更内容が上部に出ているので、その内容で良い場合には y をクリック
処理が流れて、デプロイ完了!!

デプロイ結果を確認

Lambda関数が作られている

API Gateway と連携している。

コードも登録されている。

API Gateway にも登録されている

Lambda関数の動作を確認

AWS Lambda をエミュレートするローカルエンドポイントを起動し、プログラムからAWS CLI または SDK を使用して、 Lambda 関数をローカルで呼び出します。
ローカルのテスト環境で、デプロイする前にLambda関数の動作を確認できます。

「sam local start-lambda」で検索

「sam local start-lambda」で検索
「sam local start-lambda」で実行すると、ローカルエンドポイントができるので、「aws lambda invoke・・・」でテストすることができる。

「sam local start-lambda」を実行

「sam local start-lambda」を実行

「aws lambda invoke –function-name “HelloWorldFunction” –endpoint-url “http://127.0.0.1:3001” –no-verify-ssl out.txt」を実行

「aws lambda invoke –function-name “HelloWorldFunction” –endpoint-url “http://127.0.0.1:3001” –no-verify-ssl out.txt」を実行

Lambda関数に対するローカルHTTPサーバを作成することで、API Gatewayを経由した動作確認をローカル環境で行うことができます。

「sam local start-api」でAWSドキュメントを確認する

入力待ちのターミナルは「Ctrl+C」で入力待ちをキャンセルして、
上部ターミナルから「sam local start-api」を実行し、そのローカルエンドポイントに対して、下部ターミナルから、curlコマンドで要求を投げると、

「sam local start-api」を実行

curlコマンドに対して、「hello world」が返されてる。

curlコマンドに対して、「hello world」が返されてる

build 実行後に、デプロイせずに、ローカルでテストする

ローカルテスト

以上で、SAM CLI を使ったコマンドによるサーバレス環境の生成が試すことができました!!

これで、ハンズオンストーリを完走できましたが、最後にリソースの削除の仕方を載せておきます。

リソース削除

① Cloud9を削除

「Delete」をクリック
確認の「Delete」入力
削除された

② S3バケットを削除

まずSAMのパケットを空にする
パケットの中身削除を確認
「終了」をクリック
バケットを削除
削除するバケットを確認
バケット削除された

③ Lambda

ナビゲーションの「アプリケーション」で、Cloudformationのスタックを削除する

ナビゲーションの「アプリケーション」で、Cloudformationのスタックを削除する
アプリケーションスタックを確認する

※ 次の画面にあるように、すべて削除して良いスタックかどうか分からないので、確認しながら削除する。

削除して良いか確認しながら削除

※ 緑枠のスタックは、今回の作業で発生したものではないので削除しない。

※ 緑枠のスタックは、今回の作業で発生したものではないので削除しない

※ 下記2つのスタックは、ベースとなっているVPCとEC2だったので、削除したら大変問題であった!!

※ 上記2つのスタックは、ベースとなっているVPCとEC2だったので、削除したら大変問題であった!!

④ DynamoDB テーブル削除

既に削除されている

※ 今回作成したテーブル:translate-history-2 は削除されている

以上で、AWSのホームページの初心者ハンズオンにある「SAMを使ってテンプレートからサーバーレスな環境を構築する 」 が後始末も含めて、完遂です!!