虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

AWS Protonでサーバーレスアプリケーションをデプロイしてみた

こんにちは、虎の穴ラボのNSSです。

AWS Protonというサーバーレスアプリケーション向けの新サービスが利用できるようになりました。
今回は、いままでとらラボの同人誌でいくつかサーバーレスアプリケーションの記事を書いてきた私が、
AWS Protonがどのようなサービスなのか、簡単にご紹介したいと思います。

概要

AWS Protonはコンテナやサーバーレスアプリケーションのためのフルマネージドなデプロイサービスです。
AWS Protonは、AWS LambdaのソースやAPI Gateway、DynamoDB、CodePipeLine(CI/CDツール)を統合的に作成することができます。

aws.amazon.com

なにが変わるのか

とらラボの同人誌では、AWS サーバーレスアプリケーションモデル(SAM)を利用してサーバーレスアプリケーションをデプロイする方法をご紹介してきました。 aws.amazon.com

AWS SAMでは、開発者それぞれが、コマンドラインツールをインストールし、
AWS Lambdaの関数を実装するだけでなく、
AWS Lambdaが利用するAPI Gateway や DynamoDBなどの設定をCloud Formationのymlファイルに書き、コマンドでデプロイする必要がありました。
私にとってはこのymlファイルを書く作業が難しく、結構詰まることが多かったので、AWS Lambdaの関数の実装よりも多くの時間を使いました。

AWS Protonでは、テンプレートという形で、開発者がおこなっていた設定を共有することができるようになりました。
またテンプレートにはAWSが提供しているサンプルテンプレートを使用することができ、
CRUDを行う一般的なAPIであれば、このサンプルで事足りてしまうため、ymlを1から記述する大変な作業から開放されました。

使ってみる

早速 AWS Protonを使ってみます。
用意するのは、以下の2つだけです。

  • GitHubアカウント
  • AWSアカウント

AWSコンソールにログインして、AWS Protonのマネージメントコンソールを開きます。
「使用を開始する」を押します。 f:id:toranoana-lab:20210331173526p:plain

「環境テンプレート」を押します。

f:id:toranoana-lab:20210331173821p:plain

テンプレートバンドルソースは「Use one of our sample template bundles」を選択します。
サンプルテンプレートバンドルは「 lambda-environment」を選択します。
テンプレート名に適当な名前を付け、「環境テンプレートを作成」を押します。
f:id:toranoana-lab:20210331174503p:plain

Draftで作成されるので、選択して公開します。 f:id:toranoana-lab:20210331175015p:plain

続いてサービステンプレートを作成します。
環境テンプレート同様、 テンプレートバンドルソースは「Use one of our sample template bundles」を選択します。 サンプルテンプレートバンドルは「 lambda-environment」を選択します。

互換性のあるテンプレートは先ほど作成した環境テンプレートを指定します。
f:id:toranoana-lab:20210331175606p:plain

パイプラインオプションをチェックしてサービステンプレートを「作成」を押します。
こちらもDraftで作成されるので、公開します。 f:id:toranoana-lab:20210331175904p:plain f:id:toranoana-lab:20210402195209p:plain

次にアカウントロールを設定します。 f:id:toranoana-lab:20210331180630p:plain

以下のようなアクセス権限が付与されます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CancelUpdateStack",
                "cloudformation:ContinueUpdateRollback",
                "cloudformation:CreateChangeSet",
                "cloudformation:CreateStack",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStackResourceDrifts",
                "cloudformation:DescribeStacks",
                "cloudformation:DetectStackResourceDrift",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:ListChangeSets",
                "cloudformation:ListStackResources",
                "cloudformation:UpdateStack"
            ],
            "Resource": "arn:aws:cloudformation:*:{{account_id}}:stack/AWSProton-*"
        },
        {
            "Effect": "Allow",
            "NotAction": [
                "organizations:*",
                "account:*"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": ["cloudformation.amazonaws.com"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "organizations:DescribeOrganization",
                "account:ListRegions"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": ["cloudformation.amazonaws.com"]
                }
            }
        }
    ]
}

続いて環境を作成します。 f:id:toranoana-lab:20210331181259p:plain 環境ロールは先ほど作成したロールを選択します。 f:id:toranoana-lab:20210331181413p:plain

レビュー画面で「作成」を押します。 デプロイステータスがSucceededになるまで待ちます。 f:id:toranoana-lab:20210331181832p:plain

サービスを作成します。

こちらのリポジトリをフォークしておきます。 github.com

作成済のテンプレートを選択して「次へ」を押します。 f:id:toranoana-lab:20210331182122p:plain サービス名は任意に設定し、サービスリポジトリの設定で「新しいソース接続を追加」 を押します。 f:id:toranoana-lab:20210331182228p:plain

「接続を作成」を押します f:id:toranoana-lab:20210331183121p:plain

「新しいアプリをインストール」を押すとGitHubに遷移するのでそのままインストールします。

f:id:toranoana-lab:20210331183805p:plain

ブランチ名はフォークしたソースをそのまま使う場合mainとします。 リポジトリ名は[{githubのアカウント}/aws-proton-sample-lambda-crud-service]とします。 f:id:toranoana-lab:20210331184009p:plain

インスタンス名(任意)と環境を選択します(オプションについては後述)。 f:id:toranoana-lab:20210331191129p:plain

次へを押すと確認画面に遷移するので作成ボタンを押します。

これでサービスが作成されます(しばらく時間がかかります)。

ここまでの作業でAPIがすでにデプロイされています。
Cloud Formationのマネージメントコンソールでスタックを押します。
一覧に新しく環境とサービスの2種類のスタックがデプロイされているのがわかります。
2種類のスタックからそれぞれ以下のリソースを確認することができます。

  • 環境

    • DynamoDB
  • サービス

    • AWS Lambda
    • AWS APIGateway

またCodePipelineも作成されています。

テンプレートの設定を見てみる

作成されたAPIを確認してみるとエンドポイントは以下のようになっています。

https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/task

f:id:toranoana-lab:20210331200750p:plain

この[/task]とはどこで設定されているのか確認してみましょう。
これはテンプレートで設定されています。

github.com

schema.yamlというファイルを確認するとデフォルトでtaskという設定がされています。
AWS SAM では、初期に生成されるyamlにほとんど1から設定を記述していたので苦労していましたが、その作業が大幅に削減されました。

  types:
    CrudServiceInput:
      type: object
      description: "Input properties for a Lambda backed CRUD API. When given a resource name, this input will be used to generate Create, Read, Update and Delete API methods and lambdas."
      properties:
        resource_name:
          default: "task"

Lambdaのハンドラーもデフォルトで設定されています。

        resource_handler:
          type: string
          description: "The handler path to find the CRUD methods for this API"
          minLength: 1
          maxLength: 50
          default: "src/api"

今回デプロイしたサービスのソースはRubyでした。
このテンプレートはRubyしか使えないのかと疑問に思いましたがそうではありません。
それもこのファイルのlambda_runtimeという項目でデフォルトで設定されています。

        lambda_runtime:
          type: string
          description: "The runtime for your Lambda service"
          enum: ["nodejs12.x", "python3.8", "ruby2.7", "java11", "go1.x", "dotnetcore3.1"]
          default: "ruby2.7"

これらのデフォルト設定はサービスの作成の際、カスタム設定で簡単に変更することができます。

f:id:toranoana-lab:20210331195459p:plain

作成されたあとも変更することができます。
変更する場合は変更したいサービスインスタンスを選択してアクションで仕様の変更を押します。 f:id:toranoana-lab:20210331201556p:plain

APIのルートがtestesに変わっています。
f:id:toranoana-lab:20210331200959p:plain

このようにAWSが提供するテンプレートの汎用性が高く、様々なAPIの開発に対応できることがわかります。

まとめ

今回は、AWS Protonで簡単にサーバーレスのAPIをデプロイする方法についてご紹介しました。
AWS Protonはマネージメントコンソール上の簡単な設定だけで簡単にサーバーレスアプリケーションをデプロイできるので、
本当に直感的で使いやすかったです。
リリースされたばかりのサービスなので、今後のアップデートにも注目していきたいと思います。

P.S.

■採用情報
yumenosora.co.jp

■ToraLab.fmスタートしました!
メンバーによるPodcastを配信中!
是非スキマ時間に聞いて頂けると嬉しいです。

anchor.fm

■Twitterもフォローしてくださいね!
ツイッターでも随時情報発信をしています
twitter.com