こんにちは、虎の穴ラボのNSSです。
AWS Protonというサーバーレスアプリケーション向けの新サービスが利用できるようになりました。
今回は、いままでとらラボの同人誌でいくつかサーバーレスアプリケーションの記事を書いてきた私が、
AWS Protonがどのようなサービスなのか、簡単にご紹介したいと思います。
概要
AWS Protonはコンテナやサーバーレスアプリケーションのためのフルマネージドなデプロイサービスです。
AWS Protonは、AWS LambdaのソースやAPI Gateway、DynamoDB、CodePipeLine(CI/CDツール)を統合的に作成することができます。
なにが変わるのか
とらラボの同人誌では、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のマネージメントコンソールを開きます。
「使用を開始する」を押します。
「環境テンプレート」を押します。
テンプレートバンドルソースは「Use one of our sample template bundles」を選択します。
サンプルテンプレートバンドルは「 lambda-environment」を選択します。
テンプレート名に適当な名前を付け、「環境テンプレートを作成」を押します。
Draftで作成されるので、選択して公開します。
続いてサービステンプレートを作成します。
環境テンプレート同様、
テンプレートバンドルソースは「Use one of our sample template bundles」を選択します。
サンプルテンプレートバンドルは「 lambda-environment」を選択します。
互換性のあるテンプレートは先ほど作成した環境テンプレートを指定します。
パイプラインオプションをチェックしてサービステンプレートを「作成」を押します。
こちらもDraftで作成されるので、公開します。
次にアカウントロールを設定します。
以下のようなアクセス権限が付与されます。
{ "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"] } } } ] }
続いて環境を作成します。 環境ロールは先ほど作成したロールを選択します。
レビュー画面で「作成」を押します。 デプロイステータスがSucceededになるまで待ちます。
サービスを作成します。
こちらのリポジトリをフォークしておきます。 github.com
作成済のテンプレートを選択して「次へ」を押します。 サービス名は任意に設定し、サービスリポジトリの設定で「新しいソース接続を追加」 を押します。
「接続を作成」を押します
「新しいアプリをインストール」を押すとGitHubに遷移するのでそのままインストールします。
ブランチ名はフォークしたソースをそのまま使う場合mainとします。 リポジトリ名は[{githubのアカウント}/aws-proton-sample-lambda-crud-service]とします。
インスタンス名(任意)と環境を選択します(オプションについては後述)。
次へを押すと確認画面に遷移するので作成ボタンを押します。
これでサービスが作成されます(しばらく時間がかかります)。
ここまでの作業でAPIがすでにデプロイされています。
Cloud Formationのマネージメントコンソールでスタックを押します。
一覧に新しく環境とサービスの2種類のスタックがデプロイされているのがわかります。
2種類のスタックからそれぞれ以下のリソースを確認することができます。
環境
- DynamoDB
サービス
- AWS Lambda
- AWS APIGateway
またCodePipelineも作成されています。
テンプレートの設定を見てみる
作成されたAPIを確認してみるとエンドポイントは以下のようになっています。
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/task
この[/task]とはどこで設定されているのか確認してみましょう。
これはテンプレートで設定されています。
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"
これらのデフォルト設定はサービスの作成の際、カスタム設定で簡単に変更することができます。
作成されたあとも変更することができます。
変更する場合は変更したいサービスインスタンスを選択してアクションで仕様の変更を押します。
APIのルートがtestesに変わっています。
このようにAWSが提供するテンプレートの汎用性が高く、様々なAPIの開発に対応できることがわかります。
まとめ
今回は、AWS Protonで簡単にサーバーレスのAPIをデプロイする方法についてご紹介しました。
AWS Protonはマネージメントコンソール上の簡単な設定だけで簡単にサーバーレスアプリケーションをデプロイできるので、
本当に直感的で使いやすかったです。
リリースされたばかりのサービスなので、今後のアップデートにも注目していきたいと思います。
P.S.
■採用情報
yumenosora.co.jp
■ToraLab.fmスタートしました!
メンバーによるPodcastを配信中!
是非スキマ時間に聞いて頂けると嬉しいです。
■Twitterもフォローしてくださいね!
ツイッターでも随時情報発信をしています
twitter.com