GatewayCloudFormation2017年03月09日knakayama(84)33この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。はじめにこんにちは、中山です。SAM)から利用する機会がありました。SAMではAWS::Serverless::ApiまたはAWS::ApiGateway::RestApiリソースを利用することにより、Swagger形式で記述されたファイルを扱うことが可能です。リソースを利用することが多いはずです。SAMのベースとなっているCloudFromation用のリソースを使うと、テンプレートの行数が長くなってしまうからです。リソースはSwaggerファイルを以下2つの方法で定義できます。Swaggerを外部ファイルに記述するSwaggerをインラインで記述するそれぞれメリット/デメリットがあります。本エントリでそれぞれの違いをご紹介したいと思います。本エントリを執筆する上で検証に利用した主要な各種ツールのバージョンは以下の通りです。バージョンによって結果が変更される可能性があるので、その点ご了承ください。プロパティを利用します。Gatewayの設定を行うことが可能です。指定方法は以下の2つがあります。Object形式でSwaggerファイルが設置されたバケット名とキーを指定する1点目について。Swaggerファイルが設置されているS3へのパスを指定する方式です。以下のように記述できます。s3://<_YOUR_S3_BUCKET_>/swagger.ymlただし、S3へのパスを直接記述してしまうとSwaggerの更新毎にファイルをアップロードしなければならず、少し面倒です。コマンドを利用することにより、ローカルファイルへのパスを指定可能です。指定されたファイルはこのコマンドによってS3へ自動的にアップロードされます。以下のように記述できます。src/api/swagger.ymlただし、この形式でSwaggerを指定する場合、CloudFromationの組み込み関数は現状利用できないという点は注意してください。)、以下にように記述することはできません。パラメータで渡された変数です。src/api/swagger.${Env}.yml以下のようなエラーが出力されてしまいます。specified続いて2点目について。Object形式での記述方法にも対応しています。以下のように指定可能です。swagger.yml上記のようにこの形式の場合、組み込み関数が最近サポートされました。このアップデートにより、より柔軟な形でテンプレートを記述できるようになったのは嬉しいポイントです。コマンドでローカルファイルをS3にアップロードする機能はありません。スタックの作成/更新前に自分でアップロードしておく必要があります。Swaggerを外部ファイルに記述する場合の変数についてこの形式でSwaggerを扱う場合、注意する点があります。それはSwaggerファイル内で扱える変数に一部制限があるという点です。プロパティにステージ変数を設定します。SAMで定義したLambda関数名をSwagger内で変数として扱いたい場合、以下のように記述できます。変数に代入しています。いう書式で変数を参照可能です。一見するとステージ変数を使えば何でも変数に代入できるように思えますが、現時点ではSwagger内で頻繁に利用されるであろうAWSリージョン及びAWSアカウントIDは参照できません。こちらのイシューでも言及されています。プロパティで、以下のような形式でLambda関数を指定する必要があります。awsハイライトしている箇所に注目してください。バックエンドのLambda関数を指定する際に、AWSリージョン及びAWSアカウントIDを指定しなければならないことが分かります。実際どういったエラーになるのか確認するため、例えば以下のように無理やりステージ変数にこれらの値を代入させたとします。Gatewayの内容を確認するとステージ変数自体には期待した値が代入されています。プロパティを以下のように変更しても期待した動作はしません。aws以下のようなエラーが出力されます。functionちなみに、AWSリージョンとAWSアカウントIDが含まれるLambda関数のARNを渡したとしても同様のエラーが出ます。SAMで定義したテンプレートを分離可能です。こちらのエントリにまとめました。SAMのテンプレート内にインラインでSwaggerを記述する方法についてご紹介します。最近のアップデートで対応した機能です。プロパティを利用することにより、例えば以下のような記述が可能です。SAMの機能をそのまま利用できるという点です。組み込み関数が使えるのでより柔軟な形でテンプレートを記述できます。SAM以外で管理できなくなるという点は注意してください。SAMの機能に依存している分ポータビリティは低くなります。SAMテンプレートに記述する必要があるためどうしてもテンプレートの内容が長くなってしまいます。SAMとSwaggerを記述した2つのテンプレートに分ければこの問題を解決できそうです。「社会は甘くない」のでそう簡単にはいきません。以下のようなディレクトリ構成にしたとします。files各種テンプレートは以下の内容です。SAMであることを明示的に指定する必要があります。よさそうですが、このテンプレート動きません。以下2つの問題があります。Gatewayのリソース名を別のスタックから直接参照できない1点目について。APIは実行できません。以下のようなエラーが出力されてしまいます。オプションというChangeSetのみ作成してくれる機能があります。しているため、同じエラーが出力されてしまいました。続いて2点目について。参照できるようにしていました。このテンプレートからスタックを作成しようとすると以下のようなエラーが表示されます。別テンプレートとして切り出してFn::ImportValue関数を利用したスタック間参照なら対応できるかと思ったのですが、それもダメそうです。ドキュメントに現時点では対応していないと書かれています。AWS::Serverless::Apiパラメータで渡す方式なら対応できそうですが、そうするとスタックを別々に作成しなければならず、スタックの管理が煩雑になると思います。そのため、インライン方式を採用する場合はテンプレートの行数が長くなることは覚悟しておいた方が良さそうです。まとめいかがだったでしょうか。SAMからSwaggerを扱う方法をご紹介しました。注意点などはありますが、Swaggerをそのまま利用できるというのは非常に便利だと思います。SAMを管理したいのか方針を決めてから、ご自身の環境にあう方法を見つけるとよいかと思います。本エントリがみなさんの参考になれば幸いに思います。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。本が出ていたので読んでみたところよかったので紹介させていただきます。使いたいときの注意点を書きました。新井成一64最近Sphinxつかってドキュメントを書いてるのですがなかなかイケています。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介255SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。芳賀健232こんにちは!猫様の忠実なるしもべ、芳賀健です。Tokyoで開催されました。カフェ店長のオカノです。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。