前回の記事:(AWS SAMに入門しました #1)Cloud9上で、AWS SAMとPython3系をセットアップする方法 からの続きとなります。

目次


1. まえがき

前回はCloud9の初期構築手順を取り上げました。環境が用意できれば後は開発を進めるのみとなります。

順調に開発が進むと次はデプロイの段階になると思います。

そうなると「本番の前に検証リソースとしてデプロイしたいな。」このような課題を抱えている方も多いのではないでしょうか。

開発者として、自身が開発中のアプリケーションが様々な環境でどのように動作するのか、予測することは非常に重要です。

そして、それを可能にするためには各環境(本番、検証、開発)でのデプロイと管理を分けて進行することが一般的です。

しかし、これらの作業を手動で行うとなると、それぞれの環境で異なる設定を正確に反映させることは大変な作業となります。そんな時にもAWS SAMが役立ちます。

AWS SAMは環境別のリソース設定を容易に管理し、デプロイ作業を大幅に効率化できるツールです。

特定のコマンドを使えば、各環境の設定に応じたリソースのデプロイが可能となります。

この記事では、AWS SAMとCloud9を活用して、本番・検証・開発環境ごとに分類してデプロイ管理を行う方法について詳しく解説します。

2. AWS SAMを構成するファイル

– template.yaml(またはtemplate.yml)

これはSAMアプリケーションのテンプレートファイルで、アプリケーション全体の定義や構造を記述します。

アプリケーションが使用するAWSリソース(たとえば、Lambda関数やAPI Gateway、DynamoDBテーブルなど)を定義します。

※Lambda関数としてデプロイするアプリケーションコードなどもtemplate.yamlに記載されたパスから読み込まれLambda関数に配置されます。

– samconfig.toml

これはSAM CLIの設定ファイルで、各環境ごとのリソース設定を保存します。

  • sam deploy --guidedコマンドを使用すると、ユーザーが入力した設定がこのファイルに保存され、次回以降のデプロイ時にその設定が自動的に使用されます。

※他の使い方として、予めsamconfig.tomlに環境ごとのリソース情報を記述しておき、sam deployコマンドのオプションで呼び出す事も可能です。

3. AWS SAMの主なコマンドについて

AWS SAMを使うときに重要となるのがコマンドラインから使用する主なコマンドです。ここでは特に sam deploy --guidedsam deploy --config-envに焦点を当てて説明します。

– sam deploy –guided

まずはsam deploy --guidedコマンドについてです。

このコマンドは初めてSAMアプリケーションをデプロイする際、またはデプロイ設定をガイド付きで行いたい場合に利用します。

sam deploy --guided

コマンドを実行すると、以下のようなプロンプトが表示されます。

ユーザーはプロンプトに従って必要な情報を入力します。この情報はsamconfig.tomlファイルに保存され、次回のデプロイ時に引き続き使用できます。

これにより、一度設定すればそれ以降は手間なくデプロイを行うことが可能になります。

sam deploy --guided

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

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

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam-cloud9-hello-world-cfn                   
        AWS Region [us-west-2]: us-west-2
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: N
        #SAM needs permission to be able to create roles to connect to the resources in your template  
        Allow SAM CLI IAM role creation [Y/n]: Y
        #Preserves the state of previously provisioned resources when an operation fails
        Disable rollback [y/N]: N
        Save arguments to configuration file [Y/n]: Y
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]:

上記のプロンプトでは、以下の情報を設定します:

  • Stack Name: CloudFormationで作成されるリソース名。
  • AWS Region: AWSリソースがデプロイされるリージョン。
  • Confirm changes before deploy: SAM CLIがCloudFormationスタックをデプロイ(作成または更新)する前に、変更を確認。
  • Allow SAM CLI IAM role creation: SAM CLIが必要なIAMロールを自動的に作成することを許可するかどうかを尋ねる項目。
  • Disable rollback: CloudFormationスタックのデプロイが失敗した場合に、行われた変更をロールバック(元に戻す)するかどうかを選択する。
  • Save arguments to configuration file: 今回のデプロイの設定をsamconfig.tomlという設定ファイルに保存するかどうかを尋ねる項目。
  • SAM configuration file: デフォルトでは、samconfig.tomlという名前のファイルが用いられますが、命名変更したい場合。
  • SAM configuration environment: デフォルトの設定環境名はdefaultですが、ここで他の名前を指定することで、異なる設定環境を作成(または選択)することができます。

– sam deploy –config-env

次に、sam deploy --config-envコマンドについて解説します。このコマンドは、既存の環境設定を元にアプリケーションをデプロイする際に使用します。

sam deploy --config-env <環境名>

ここで指定するは、前述したsamconfig.tomlファイル内で定義した環境の名前となります。

このコマンドを使うことで、様々な環境(本番、検証、開発など)でのデプロイを簡単に管理することが可能となります。

例えば、本番環境へのデプロイは以下のように実行します。

sam deploy --config-env prd

上記のコマンドは、samconfig.toml内の[prd]セクションにある設定を使用してデプロイを行います。

これらのコマンドを使いこなすことで、AWS SAMをより効率的に活用することができます。

4. 環境ごとのデプロイと管理の手順

ここでは、環境ごとにデプロイ管理する手法について説明します。

AWS SAMを利用する際、テンプレートに環境変数としてプレフィックスを付与し、samconfig.tomlから環境変数を渡す方法をおすすめします。これにより、各環境でデプロイされるリソースの命名を環境ごとに分類し、管理が容易になります。

サンプルコードを以下に示します。これは環境変数がセットされておらず、Lambda関数を一つ定義したtemplate.yamlファイルになります。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hello-world-test

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: hello-world.lambda_handler
      Runtime: python3.10
      FunctionName: "hello-world-function"
      Architectures:
        - x86_64

– 開発環境の設定とデプロイ

  1. 開発環境の設定を行います。SAMのテンプレート (template.yaml) にて、リソース名に環境変数を追加します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hello-world-test

Parameters:
  Stage:
    Type: String
    Description: Deploy Stage

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: hello-world.lambda_handler
      Runtime: python3.10
      FunctionName: !Sub "${Stage}-hello-world-function"
      Architectures:
        - x86_64

ここでは ${Stage} 変数が、環境名を表します。
また、Parametersセクションが一つ増えていますが、これはsamconfig.tomlファイルから変数を受け取るために必要な設定となります。

  1. 次に、SAMの設定ファイル (samconfig.toml) に開発環境 (dev) のパラメータを追加します。
    (※version = 0.1は最初の1行にのみ必須です。)
version = 0.1

[dev.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-dev"
stack_name = "hello-world-dev"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=dev"

他の項目について補足

  • resolve_s3 これはAWS SAMのパラメータで、デプロイメントパッケージをS3にアップロードするかどうかを指定します。Trueに設定すると、SAMは自動的にアーティファクトをS3にアップロードします。
  • s3_prefix このパラメータは、SAMがデプロイメントパッケージをアップロードする際のS3バケット内のプレフィックス(ディレクトリのようなもの)を指定します。
  • capabilities AWS CloudFormation スタックを作成または更新する際に、AWS CloudFormationが特定のリソースを作成するために必要な IAM ロールやポリシーを指定するために使用されます。”CAPABILITY_IAM”を指定することで、AWS CloudFormationはIAMリソースを作成できます。これは特定のIAMリソース(例えば、ロールやユーザー)の作成を許可するため、通常は最小限の権限を持つIAMユーザで実行するために必要となります。
  • stack_name は CloudFormationで作成されるスタック名を指定します。これは、リソースグループを一元管理するための名前となります。
  • region はデプロイ先となるAWSリージョンを指定します。
  • parameter_overrides はテンプレートのパラメータをオーバーライド(上書き)します。ここでは ${Stage} 変数を dev に設定します。

これらの設定を終えたら、次のコマンドで開発環境へデプロイを行います。

sam deploy --config-env dev

作成されたLambda関数を見てみると、開発環境の環境変数devが付与されていることがわかります。

parameter_overrides について、複数のパラメータを渡す場合はスペース区切りで指定します。次のように表記でも可能です。

parameter_overrides = [
    "Stage=dev",
    "Parameter2=value2",
    "Parameter3=value3"
]

ここで parameter_overrides を使用して ${Stage} 変数を設定します。

– 検証環境の設定とデプロイ

  1. 次に、検証環境の設定を行います。前述した通り、SAMの設定ファイル (samconfig.toml) に検証環境(stg)のパラメータを追加します。
[stg.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-stg"
stack_name = "hello-world-stg"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=stg"

ここでも parameter_overrides を使用して ${Stage} 変数を設定します。

  1. これらの設定を終えたら、次のコマンドで検証環境へデプロイを行います。
sam deploy --config-env stg

このコマンドを実行すると、作成されたLambda関数名に検証環境の環境変数stgが付与されていることがわかります。

– 本番環境の設定とデプロイ

  1. 最後に、本番環境の設定を行います。SAMの設定ファイル (samconfig.toml) に本番環境(prd)のパラメータを追加します。
[prd.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-prd"
stack_name = "hello-world-prd"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=prd"

ここでも parameter_overrides を使用して ${Stage} 変数を設定します。

  1. これらの設定を終えたら、次のコマンドで本番環境へデプロイを行います。
sam deploy --config-env prd

このコマンドを実行すると、Lambda関数名に本番環境の環境変数prdが付与されていることがわかります。

以上が環境ごとのデプロイと管理の手順です。

この方法を用いることで、開発、検証、本番の各環境を一元的に管理することができ、各環境でのデプロイも容易になります。

5. 最終的なファイル構成と中身

– template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hello-world-test

Parameters:
  Stage:
    Type: String
    Description: Deploy Stage

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: hello-world.lambda_handler
      Runtime: python3.10
      FunctionName: !Sub "${Stage}-hello-world-function"
      Architectures:
        - x86_64

– samconfig.toml

version = 0.1

[dev.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-dev"
stack_name = "hello-world-dev"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=dev"

[stg.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-stg"
stack_name = "hello-world-stg"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=stg"

[prd.deploy.parameters]
resolve_s3 = true
region = "us-west-2"
s3_prefix = "hello-world-prd"
stack_name = "hello-world-prd"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=prd"

6. トラブルシューティング:よくある問題と対処法

AWS SAMやAWSのサービスを利用して開発を行う中で、様々な問題に遭遇することがあります。ここではよく遭遇する問題とその対処法について説明します。

– デプロイがうまく行かない

問題:

AWS SAMを使用してアプリケーションをデプロイしようとした際に、デプロイが失敗する。

対処法:

  • 最初に、エラーメッセージをよく読んでください。エラーメッセージは通常、問題の原因を示しています。
  • CloudFormationのスタックイベントを確認します。デプロイの問題の多くは、CloudFormationのスタックの作成または更新が失敗することによります。
    AWS Management Consoleから対象のスタックの “イベント” タブを確認することで、スタックの作成または更新がどの点で失敗したのか?と詳細なエラー文を知ることができます。

「CloudFormation」サービス画面→「イベント」タブ→「状況の理由」

Resource handler returned message: "1 validation error detected: Value 'Sub "${Stage}-hello-world-function"' at 'functionName' failed to satisfy constraint: Member must satisfy regular expression pattern: 

上記エラー文章では、「Sub “${Stage}-hello-world-function”」の記述方法がおかしいと指摘されています。

正しくは「!Sub “${Stage}-hello-world-function”」となります。このようにトラブルシューティングにはコンソール画面から行うことが視認性高くオススメです。

  • SAM CLIのログからも確認が可能です。sam deploy コマンドに -debug フラグを追加することで、デバッグ情報をログに表示させることができます。

7. AWS SAMでデプロイしたリソースを削除する。

AWS SAM でデプロイ管理する利点は、環境ごとにリソース削除も一括で行えることです。
以下コマンドでは、開発環境のリソースのみ削除しています。
ターミナルに流してリソースが削除できることを確認します。

sam delete --stack-name hello-world-dev

Are you sure you want to delete the stack hello-world-dev in the region us-west-2 ? [y/N]: y

リージョンから削除して良いか?聞かれます。削除するなら「y」を渡します。

Are you sure you want to delete the folder hello-world-dev in S3 which contains the artifacts? [y/N]: y

S3バケットを削除して良いか?聞かれます。削除するなら「y」を渡します。

開発環境のAWSリソースのみが削除されていることを確認する。
検証や本番環境についても同様の操作でリソース削除が可能です。

8. まとめ

最後まで閲覧頂きありがとうございました。

この記事では、AWS SAMとCloud9を使用して、本番、検証、開発といった各環境ごとにAWS環境をデプロイ・管理する方法について解説しました。

特にAWS SAMが提供する柔軟な設定とパラメータ化機能により、各環境の環境設定を容易に管理することができることを紹介しました。

この記事がAWS SAMを使用したAWS環境の環境管理に取り組む方々の参考になれば幸いです。