Amazon Web Services ブログ

新しいサーバーレスアプリ作成機能で CI/CD も作成した、その後…

本記事は「新しいサーバーレスアプリ作成機能で CI/CD も作れます」のその後のステップとして記述しています。まだその記事を見ていない方は、まずはそちらをご覧ください。以下は、その機能で、テンプレートとして Serverlerss API backend を選択し、プロジェクトリポジトリとして CodeCommit を作成された結果を元に説明しています。CI/CD や CodeCommit をよくご存知の方は読み飛ばしていただいて構いません。


実行テスト

作成されたアプリケーションは、何も変更しなくてもすでに実行できる状態にあります。
例えば、ターミナルなどから以下のコマンドを実行してみてください(なお、下記のように日本語を含むデータで実行する場合は、ターミナルの文字コード設定が UTF-8 であることを確認ください)。

curl -d '{"id":"001","name":"テスト"}' -H "Content-Type:application/json" -X POST https://<<API EndPoint>>

DynamoDBのコンソールをみると、新しいデータが登録されることがわかります。もちろん、好みの REST API テストツール(ブラウザプラグインなど)を使っても構いません。

構成の確認

生成されたアプリケーションで、API 定義、Lambda 関数がどのように定義されているかを見るのは、サーバーレスを始めたばかりの開発者には参考になるかと思います。例えば、API Gateway の構成を見てみると、以下のように設定されていることがわかります。

名称で想像できる通り、3つの関数は、全件検索、データの書き込み、特定 ID のデータの取得のための処理であり、それらが対応する API に紐づけられています。この 3つの処理はよく使われる典型的なものですので、そのコードは、多くの処理で参考になるでしょう。

コードの編集

テンプレートベースのサーバーレスアプリ作成機能で設定された Lambda 関数がどういうものか、コンソールから確認してみましょう。作成したサーバーレスアプリケーションへ Lambda コンソールからアクセスし、その中のリソースのセクションを見ると Lambda Function タイプのものが作成されていることがわかります。

ここにあるリンクをクリックすれば、それぞれの Lambda 関数の画面に飛びますが、そのコードは表示されず、「インラインコード編集を有効にできません」と表示される場合があります。生成されたコードはどこにあるのでしょう?

もう一度、Lambda コンソールから作成したサーバーレスアプリケーションへアクセスし、コードのタブにあるリポジトリのリンクをクリックします。ソースコードがツリー構造で表示され、その src フォルダを進むと、生成されたコードを確認できます。

ちょっとした変更くらいならここから作業するということもできますが、継続的な開発を考えると開発環境から行いたいものです。その一連の作業フローは以下のようになります。

以降では、新規の AWS Cloud9 環境を作るところから始める場合を例にあげながら、その作業手順を具体的にご紹介します。

AWS Cloud9 開発環境の準備

再度、Lambda コンソールから作成したサーバーレスアプリケーションのコードタブを表示します。新規の環境構築のために「Cloud9 で作成」をクリックします。AWS Cloud9 の作成ステップが始まります。

  • 環境の名前を入力を促されますので、わかりやすい名前を設定して次のステップに移動します。
  • 作成する開発環境の構成を選択する画面が表示されます。最初に EC2 環境にするか、SSH で接続可能なリモート環境にするかの選択があります。以下では簡単のため EC2 環境でのデフォルト選択で進んだものとして進めています。
  • 選択した項目の最終確認をして、環境の作成に進みます。AWS Cloud9 の環境作成が始まります。数分待つと、Webブラウザ上に開発環境が表示されます。

開発環境からのコード編集

コード編集のために開発環境から行うステップは次のとおりです。

  1. 初期化、接続認証:
    Cloud9 環境から CodeCommit への接続のための初期化と接続設定を行います(これは一度やれば次回以降は設定が継続利用されます)。EC2 環境上の Cloud9 開発環境では、その中で表示されているターミナルウィンドウから以下のコマンド入力を実行することで、リポジトリである CodeCommit への接続設定を行うことができます。

    git init
    git config --global credential.helper '!aws codecommit credential-helper $@'
    git config --global credential.UseHttpPath true

    これで、以降のリポジトリ操作が可能になります。ご利用の開発環境が Cloud9 ではない場合など、別の接続/認証方法が必要なケースがあります。詳しくはこちらを参照ください。

  2. ローカルへ展開: 開発環境側にコードの複製を作ります。
    これを行うためには対象リポジトリの URL を知っておく必要があります。これは、Lambda コンソール内の対象のサーバーレスアプリケーション画面におけるコードタブの「リポジトリの詳細」セクションからコピーできます。

    リポジトリとして AWS CodeCommit を選択している場合は、リポジトリURLは "https://git-codecommit.<<REGION>>.amazonaws.com/v1/repos/<<RepositoryName>>" のような形になっているはずです。これを用いて、Cloud9 の画面に戻り、ターミナルから以下のコマンドを入力します。

    git clone <<Repository URL>> <<LocalReposName>>

    処理が進むと、<<LocalReposName>> をルートとするコードツリーが左ペインに現れます(<<LocalReposName>> を省略した場合は <<RepositoryName>> が使われます)。

  3. コード編集、ローカルリポジトリへコミット:
    コードツリーの中から実際のコードを確認できます。

    必要に応じてコード変更します。たとえば、src/handlers/put-item.jsの 28-31 行部分を以下のように変更します。

        const params = {
            TableName: tableName,
            Item: { id, name : name == "テスト" ? "Test" : name }, // 変更した行
        };

    コード編集を終えたら保存し、ターミナルから以下のコマンドを入力して、変更内容をローカルのリポジトリに確定させます。

    cd <<コードツリーのルートディレクトリ>>  # ローカルリポジトリのルートへ移動
    git add src/handlers/put-item.js  # 変更したファイルをローカルリポジトリに追加
    git commit -m "特定の入力値の場合の変更処理を追加"  # 変更をローカルリポジトリにコミットし、メッセージを追記
  4. リモートへ確定: 変更をリモートリポジトリに確定させます。
    git push

    これによりビルドプロセスが開始されます。実際に AWS CodePipeline のコンソールを見ると、そのプロセスを確認できます。

    また、リポジトリである CodeCommit には変更履歴が記録され、その内容を確認できます。

ビルドプロセスが成功したら、もう一度、実行テストをやってみてください。ただし、先ほどとは違う値の ID(例えば 002)に変えることをお忘れなく!(同じものでのデータ投入はできません)。変更したコードが適用されていれば、DynamoDB に入る値が変わるはずです。

ここで紹介した手順 1-3 は基本手順としてよく使うことになります。加えて、別の開発者が変更した内容の同期化や、開発ラインを分岐させるなどの作業が実施の開発では必要になるでしょう。それも git コマンドで実現できます。

補足

  • 生成されたビルドプロセスでは基本形としてシンプルな「ビルド-デプロイ」だけが設定されています。ここに処理ステージを追加することができます。よくあるケースとしては、コードのレビューするための通知と許可のステップを挟んだり、テスト環境のビルド作業や単体の自動テスト作業を組み込んだりする、などがあります。
  • ここでは開発環境として AWS Cloud9 を利用しましたが、Cloud9 でしか作業できないわけではありません。お手持ちの PC に好みの開発環境と対応する AWS Toolkit および git クライアントがインストールされていれば、同じような手順で開発を行うことができます(接続認証以外の手順は同じです)。さらに、 AWS SAM CLI とともに使えば、ローカル環境でのテストやデバッグも可能です。

サーバーレス 事業開発  杉