AWS Serverless Application Model

【AWS SAM】SAM CLIを使って今流行りのIaC環境を構築してみた

ご挨拶

お疲れ様です、寺井です。

既に流行りに乗り遅れている気がしないでもないですが、そろそろ「IaC」とやらに慣れ親しんでおきたいと感じたため、「AWS SAM」を使ってみることにします。

IaC(Infrastructure as Code)とは、サーバーなどのシステムインフラの構築を、コードを用いて行うことです。
引用元 - IaCとは?|Udemy メディア

AWS でサーバーレスアプリケーションを構築するために使用できるオープンソースのフレームワークです。
サーバーレスアプリケーションは、タスクを実行するために連動する Lambda 関数、イベントソース、およびその他のリソースの組み合わせです。
引用元 - AWS Serverless Application Model (AWS SAM) とは

今回のゴール

EC2上でアプリケーションの開発環境として「SAM CLI」環境を構築して、「sam deploy」コマンドを実行するだけでアプリケーションがデプロイされるようにする

実装

今回はAmazon linux2で設定していきます
(EC2の起動部分については割愛します)

※EC2に付与する権限について
EC2に適切なIAMロールが付与されていないと、デプロイ時に以下のようなエラーによりデプロイできませんので、事前に適切なロールをEC2にアタッチする必要があります

botocore.exceptions.NoCredentialsError: Unable to locate credentials

今回のテンプレートをデプロイすると「CloudFormation」スタックが作成され、スタックから「APIGateway」「Lambda」を作成。Lambda実行に必要な「IAMロール」が生成され、LambdaのZipファイルとSAMのテンプレートファイルを「S3」に格納します。
(パッケージタイプに[Image]を指定した場合、「ECR」にリポジトリが作成され、imageファイルを格納します。)

よって、EC2には以下のポリシーを含めたIAMロールをアタッチすればOK

  • AWSCloudFormationFullAccess
  • IAMFullAccess
  • AWSLambda_FullAccess
  • AmazonAPIGatewayAdministrator
  • AmazonS3FullAccess
  • AmazonEC2ContainerRegistryFullAccess

(今回は面倒なのでFullAccess権限をつけていますが、実際に運用する際には権限を絞って利用するようにしましょう。)

以降の実装に関しては、お好みのターミナルでEC2にsshでログインして作業してください

事前準備

Gitのインストール

SAMのテンプレートダウンロード時にGitコマンドの「clone」が実行されるため、Gitが必要になります

# yumのアップデート
$ sudo yum update -y

# Gitのインストール
$ sudo yum install -y git

# バージョン確認
$ git version

-----
git version 2.37.1
-----

Pythonのインストール

今回はアプリケーションのランタイムにPythonを指定するため、Pythonを事前にインストールしておきます

# amazon-linux-extrasで対応しているpythonのバージョンを確認
$ amazon-linux-extras | grep -i python

-----
 44  python3.8                available    [ =stable ]
-----

# pythonのインストール
$ sudo amazon-linux-extras install -y python3.8

# エイリアスを設定してコマンド実行時に使用されるバージョンを上書き
$ echo 'alias python=python3.8' >> ~/.bashrc
$ source ~/.bashrc

# バージョン確認
$ python -V

SAM CLIのZipファイルをダウンロード

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

-----
aws-sam-cli-linux-x86_64.zip
-----

Zipファイルを解凍

「-d」オプションで 指定したディレクトリにファイルを展開します

$ unzip aws-sam-cli-linux-x86_64.zip -d sam_installer

対象ディレクトリに移動して中身確認

$ cd sam_installer/

# 確認
$ ls
-----
aws-sam-cli-src  dist  install  THIRD-PARTY-LICENSES
-----

インストール実行

$ sudo ./install
-----
You can now run: /usr/local/bin/sam --version
-----

# 確認
$ sam --version
-----
SAM CLI, version 1.61.0
-----

これにてSAM CLIのインストールが完了しました

SAM でアプリケーションをデプロイ

SAM側で用意されているアプリケーションのテンプレートを利用してデプロイしてみます

SAMの初期設定

SAMのプロジェクトを設置するディレクトリで実行します

$ sam init

サクッと作りたいので「1」を選択

# どのテンプレート ソースを使用しますか
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Hello World Exampleの「1」

# AWS クイック スタート アプリケーション テンプレートを選択する
Choose an AWS Quick Start application template
        1 - Hello World Example
        2 - Multi-step workflow
        3 - Serverless API
        4 - Scheduled task
        5 - Standalone function
        6 - Data processing
        7 - Infrastructure event management
        8 - Lambda EFS example
        9 - Machine Learning
Template: 1

ランタイムは指定したいので「N」

  • memo :今回のように[y/N]と記載されている場合、そのままEnterを押せば[N]を選択したことになる(大文字側が選択される)
    # 最も一般的なランタイムとパッケージ タイプを使用しますか?
    Use the most popular runtime and package type? (Python and zip) [y/N]:

    任意のランタイムを選択

    # どのランタイムを使用しますか
    Which runtime would you like to use?
        1 - dotnet6
        2 - dotnet5.0
        3 - dotnetcore3.1
        4 - go1.x
        5 - graalvm.java11 (provided.al2)
        6 - graalvm.java17 (provided.al2)
        7 - java11
        8 - java8.al2
        9 - java8
        10 - nodejs16.x
        11 - nodejs14.x
        12 - nodejs12.x
        13 - python3.9
        14 - python3.8
        15 - python3.7
        16 - ruby2.7
        17 - rust (provided.al2)
    Runtime:14

任意のタイプを選択

# どのパッケージタイプを使用しますか?
What package type would you like to use?
        1 - Zip
        2 - Image
Package type: 1

不要なので「N」

  • AWS X-Rayとは・・・アプリケーションのパフォーマンスのボトルネックを特定できます。
    # アプリケーションの関数で X-Ray トレースを有効にしますか? [y/N]: N
    Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]:

任意の名前を設定(この名前でディレクトリが作成されます)

# プロジェクト名 [sam-app]: 任意
Project name [sam-app]:

# 確認
$ ls
-----
aws-sam-cli-linux-x86_64.zip  sam-app  sam_installer
-----

以上の設定でアプリケーションのテンプレートが作成できました

テンプレートの内容について

作成されたディレクトリに移動して中身を確認します

$ cd sam-app/

$ ls
-----
events  hello_world  README.md  template.yaml
-----

何やら色々出来上がってますが、今回必要なファイルを簡潔にまとめると

hello_world             アプリケーションのディレクトリ
    ├app.py             Lambdaが呼び出す関数(エントリーポイント)
    └requirements.txt   Pythonに必要なモジュールを記載すれば「sam build」時に展開される
template.yaml           AWSリソースを定義するテンプレートファイル

(長くなるので詳しい説明は別の機会に...)

ビルドしてデプロイの準備

$ sam build

-----
...
Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml
...
-----

実際にデプロイ

「-g(--guided)」オプションを付けて実行することで、質問形式のガイドに沿ってデプロイができます。
また、今後のデプロイ時に必要な設定ファイルを作成します。

$ sam deploy -g

-----
Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
-----

deploy時の設定内容

デフォルトの名前(sam-app)で進めるのでそのままEnter

Stack Name [sam-app]:

東京リージョン(ap-northeast-1)を指定

AWS Region [us-east-1]: ap-northeast-1

デフォルトは「N」となっているが、デプロイ前に確認したいので「y」

# デプロイ前に変更を確認するか
Confirm changes before deploy [y/N]: y

SAM側で必要なロールの作成を任せたいのでSAM側で必要なロールの作成を任せたいのでそのままEnter

# SAM CLI IAM ロールの作成を許可する
Allow SAM CLI IAM role creation [Y/n]:

ロールバックしてほしいのでそのままEnter

# ロールバックを無効にする
Disable rollback [y/N]:

「サンプルアプリケーションが認証なしで API Gateway API を設定すること(認証なしで誰でもAPIを叩ける状態)を許容するか?」という内容。今回は問題ないので「y」で進める

HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y

設定内容は保存し、今後も使用したいためそのままEnter

# 引数を設定ファイルに保存
Save arguments to configuration file [Y/n]:

ファイル名、設定環境もデフォルトで進める

SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:

実際のデプロイ実行前に確認されるので、デプロイされるリソースに問題なければ「y」

Waiting for changeset to be created..
CloudFormation stack changeset

~デプロイされるリソースが表示される~

# デプロイ前の CloudFormation 変更セットのプレビュー
Previewing CloudFormation changeset before deployment
========================================
Deploy this changeset? [y/N]: y

...
Successfully created/updated stack - sam-app in ap-northeast-1

マネジメントコンソールからCloudFormationを確認してみると、「sam-app」がデプロイされている

Lambdaコンソールからテスト実行してみると、問題なく実行できた

2回目以降のデプロイ

hello_worldディレクトリの「app.py」を変更してから「sam deploy」を実行してみる

(今回のdeploy時には先ほどの「sam deploy -g」で生成された「samconfig.toml」ファイルの設定内容に基づいてデプロイされます)

$ sam deploy

変更内容に間違いなければ「y」で進める

Previewing CloudFormation changeset before deployment
========================================
Deploy this changeset? [y/N]: y

再度CloudFormationを確認してみると、「sam-app」がアップデートされている

Lambdaコンソールからテスト実行してみると、変更が適用されていることが確認できる

これにて「AWS SAM CLI」による開発環境の構築が完了しました!

感想

環境を構築するまでは少し大変ですが、必要な権限を持ったIAMロールの作成や、アプリケーションやそれに付随するAWSリソースの変更などが容易に行えるので、継続的に開発を行っていくのであれば「SAM CLI」は非常に便利だと感じました。

あと「IaC」使ってることでワンランク上のエンジニアになれた気がして気分がいいです。

次回は異なるアカウントにデプロイしてみたり、今回解説し切れなかったSAM CLI開発時の注意点等に関してお話しようと思います。

ありがとうございました!

返信を残す

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

CAPTCHA