【AWS】とにかくAWS-SAMを触ってみよう【サーバレス】

2月 12, 2022

どもども、最近肌が荒れ気味のsaisaiです。


本日は、AWS環境にサーバレスアーキテクチャからプログラムのデプロイまでまるっと行ってくれる便利フレームワークであるAWS-SAM(Serverless Application Model)を触ってみたので記事にしたいと思います。


AWSクラウドエンジニアとして働き始めてはや1年、そろそろコンソール画面ともおさらばしていきたいなぁということで頑張って挑戦してみようと思います。


今回、プログラム言語はGolangを使用します。Golangを使用する上での事前準備も済ませておいてください。

環境構築

まずはAWS-SAMを使用できるようにクライアントPCに環境構築していきたいと思います。


クライアントPCのOSはMacの想定です。Windowsの方は一部導入方法が異なるので注意してください。また、Homebrewを事前にインストールしているものとします。


まずはAWS-CLIとAWS-SAM-CLIをインストールします。AWS-CLIはCUIでAWSサービスを操作するものになります。コンソール画面卒業の第一歩ですね!

$ brew install awscli
$ brew install aws-sam-cli

次に使用するIAMユーザーのAWSクレデンシャル 情報を登録します。こちらの情報を用いて認証されたユーザーがAWSサービスを操作することができます。漏洩すると大変なことになる情報ですので大切に管理し、アタッチするIAMポリシーは最低限のものにしておきましょう。すでにクレデンシャル情報を登録している場合はそちらを使用するかプロファイルを切って新たに登録してください。

$ aws configure
AWS Access Key ID [None]: "アクセスキー "
AWS Secret Access Key ID [None]: "シークレットアクセスキー "
Default region name [None]: ap-northeast-1
Default output format [None]: json

これでコマンドによるAWSサービスの操作が可能になりました。試しに今回AWS-SAMのテンプレートファイルを配置するS3バケットを作成してみましょう。

$ aws s3 mb s3://バケット名 ※バケット名はグローバルに一意でなければなりません
make_bucket: バケット名


これで環境構築と準備は完了です!

雛形を作成する

それでは早速雛形を作成していきましょう。


まずは作業ディレクトリを作成します。今回は"aws-sam-sample"というディレクトリを作成しその中でゴニョゴニョやっていくとしましょう。

$ mkdir aws-sam-sample
$ cd aws-sam-sample

それではAWS-SAMの雛形を作成します。今回はランタイムをgo1.xにしますので以下のようになります。言語によりコマンドが異なりますので使用する言語によって臨機応変に対応してください!

$ sam init --runtime go1.x --name aws-sam-golang

以下のように聞かれますが、今回は"AWS Quick Start Templates"の方を選択してください。

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice:1

テンプレートの種類は"Hello World Example"を選択します。

AWS quick start application templates:
	1 - Hello World Example
	2 - Step Functions Sample App (Stock Trader)
Template selection: 1

以下のようなディレクトリが作成されていればOKです。移動して中身も確認しておきましょう。

$ ls
aws-sam-golang
$ cd aws-sam-golang
$ ls
hello-world  Makefile  README.md  template.yaml

無事雛形が作成されていますね!サンプルプログラムは"hello-world"ディレクトリにあるようですね。

$ cd hello-world
$ ls
go.mod  go.sum  main.go  main_test.go

それではプロラムの確認からデプロイまでやっていきましょう。

AWS-SAMを使用したデプロイ

早速サンプルプログラムの中身を見てみましょう。こちらのプログラムがLambdaにデプロイされます。


VSCODEなどのエディタを使用して確認するといいでしょう。


“main.go"を確認してみるとサードパーティパッケージとして"github.com/aws/aws-lambda-go/events"と"github.com/aws/aws-lambda-go/events"が必要になるようですね。


こちらはlambdaをgolangで使用する際に必要になるパッケージです。インストールしておきましょう。

$ go get github.com/aws/aws-lambda-go/events
$ go get github.com/aws/aws-lambda-go/lambda


AWS公式のサンプルプログラムなのでここでの記載は控えますが、どうやらAPI GatewayからGetメソッドを受け取った際にステータスが200だった場合は特定のレスポンスを返すようです。エラーハンドリングも記載されています。


ここでAPI Gatewayが構築されることが予測できましたが、AWSアーキテクチャの構成自体は"aws-sam-golang"ディレクトリの"template.yaml"ファイルに記載されておりますので、AWS-SAMについてより詳しく知りたい場合はこちらも確認すると良いでしょう。


それではLambdaにプログラムをデプロイできるようにビルドし、バイナリファイルにしておきます。
“aws-sam-golang"にて

$ GOOS=linux GOARCH=amd64 go build -o hello-world/hello-world ./hello-world

を実行しましょう。ビルドが走るはずです。"Build Succeeded"と表示されれば成功です。


本来はここでローカルテストなどを行った方が良いのですが、今回はサンプルのものから一切変更していない為このままデプロイしていきましょう。


まずはクレデンシャル情報の生合成を確認します。"aws-sam-golang"ディレクトリで

$ sam validate
/hoge/fuga/template.yaml is a valid SAM Template

上記のような表示であれば問題ないでしょう。

“template.yaml"とコードとの依存関係の.zip ファイルを作成しあらかじめ作成したS3バケットにアップロードします。

$ sam package --template-file template.yaml --s3-bucket バケット名 --output-template-file sample.yaml
Successfully packaged artifacts and wrote output template to file sample.yaml.

これでテンプレートファイルの準備もOKです!それではデプロイしてみましょう!!

$ sam deploy --region ap-northeast-1 --template-file /hoge/fuga/sample.yaml --stack-name sample-sam-golang --capabilities CAPABILITY_IAM
Successfully created/updated stack - sample-sam-golang in ap-northeast-1

(/hoge/fuga/は自身のsample.yamlまでのパスに置き換えてください。)

うまくいったようですね!

作成確認・動作確認

それでは実際コンソール画面から構築されたAWSアーキテクチャを確認していきましょう。


ますは"CloudFormation"を確認してみましょう。sample-sam-golangという名前のスタックが作成されていることが分かります!(画像省略)


次に"Lambda"を確認してみましょう。"sample-sam-golang-HelloWorldFunction-…"という名前の関数が今回作成した関数です。(こちらも画像省略)


最後にAPI Gatewayを見てみます。"sample-sam-golang“という名前のAPIが作成されているはずです。左側ナビゲーションペインより"設定"をクリックすると下記のようなAPIを叩くデフォルトのURLが確認できます。

https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello

こちらを使用してAPIの動作確認をしてみましょう。curlコマンドを叩いてもいいですし、ウェブブラウザからも確認できます。以下のようにレスポンスが返ってきたら大成功です!

Hello, グローバルIP

やったね!

お片付け

動作確認が無事完了しましたらお片付けをしていきましょう。


AWS-SAMはCloudFormationでAWSアーキテクチャを構築しているので対象のスタックを削除すればAWS-SAMで作成したものは全て綺麗に削除されます。


せっかくなのでAWS-CLIを利用して削除してみましょう。

$ aws cloudformation delete-stack --stack-name sample-sam-golang

これでスタックの削除、関連するAWSサービスの削除が開始されます。


もう一つ削除するものがあります。それはS3バケットです。


今後も今回作成したAWS-SAMフレームワークを実行する可能性がある場合は残しておいても問題ありませんが、そうでない場合は削除しておきましょう。


S3はバケットの中身を空にしないとバケット自体を削除できないので2つのコマンドを実行します。

$ aws s3 rm s3://saisai-sam-sample-bucket --recursive
$ aws s3 rb s3://saisai-sam-sample-bucket

これでS3バケットも削除できました。片付け完了です。

最後に

以上がAWS-SAMの基本的操作でした。


template.yamlの内容や環境変数の定義方法など深掘りすれば考えることはまだまだたくさんありますが、AWS-SAMが何をするものなのかというのはかなり具体的にイメージできたように思います。


サーバレスアーキテクチャは運用保守が簡易で状況によっては大きなコスト削減も見込める為、AWS-SAMは使えて損はしないと言えるでしょう。


めざせ!脱コンソール画面!


ここまで読んでいただきありがとうございました!


↓オススメ教材

AWS,Golang

Posted by CY