怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

AWS Lambda の関数をAWS APIGatewayで発行したエンドポイントで実行させる

f:id:ka0in:20190311131435p:plain AWS Lambdaにgolang製の関数を設定し、トリガーにAWS APIGateway設定しエンドポイントを発行、そのエンドポイントのコールで関数を実行するまでの手順です。

1 AWS Lambdaの設定

まず関数を作成します。 AWSLambda

AWS Lambdaのトップページで「関数の作成」を選択します。

AWSLambda

次ページで「関数名」と「ランタイム」、「ロール」を設定します。

AWSLambda

関数を作成すると、「関数コード」で関数をアップロードする箇所がありますので、そこで関数を登録します。

関数の登録の主な手順は「ローカルで実行したい関数のファイルを用意する」「ビルドをかける」「zip化する」です。

S3にあるファイルを登録する方法もありますが、今回はローカルから直接登録します。

関数の用意

今回はサンプルでTwitter APIと連携したコードを使用します。 対象のキーワードのツイートを検索して、そのツイートをいいねしていくコードです。(コードの中身はサンプルですので、詳細は割愛します)

KeywordFavorite.go
import (
    "../keys"
    "fmt"
    "github.com/aws/aws-lambda-go/lambda"
    "net/url"
)

type MyEvent struct {
    Keyword string `json:"keyword"`
}

type MyResponse struct {
    Message string `json:"result:"`
}

func keywordFavorite(event MyEvent) (MyResponse, error) {
    res := searchKeyword(event.Keyword)
    fmt.Println(event.Keyword)
    return MyResponse{Message: fmt.Sprintf(res, event.Keyword)}, nil
}

func main() {
    lambda.Start(keywordFavorite)
}

func searchKeyword(keyword string) string {
    api := keys.GetTwitterApi()
    result := ""

    v := url.Values{}
    v.Set("count", "20")

    res, err := api.GetSearch(keyword, v)

    if err != nil {
        fmt.Println("error")
    } else {
        for _, tweet := range res.Statuses {
            fmt.Println(tweet.Id)
            result = doFavorite(tweet.Id)
        }
    }
    return result
}

func doFavorite(tweetId int64) string {
    api := keys.GetTwitterApi()
    result := ""

    _, err := api.Favorite(tweetId)

    if err != nil {
        fmt.Println("error")
        result = string(tweetId) + "is Failed"
    } else {
        fmt.Println("Done")
        result = string(tweetId) + "is Success"
    }

    return result
}

build/zip化

このコードをローカルに配置したら、そのファイルをビルドします。 ビルドするためにlambdaのSDKを下記コードでインストールします。

$ go get github.com/aws/aws-lambda-go/lambda

インストールが成功したら以下のコードでビルドをかけます。

$ GOOS=linux GOARCH=amd64 go build -o KeywordFavorite

ビルドをかけ終わるとバイナリファイルが生成されますので、それをzip化します。

$ zip handler.zip ./KeywordFavorite

正常にhandler.zipが生成されていれば成功です。

関数の登録/テスト実行

先ほどのAWS Lambdaのページにてhandler.zipをアップロードします。 なおここで設定するハンドラ名はバイナリ名と合わせておきます。

AWSLambda

次にテスト実行ですが、テストケースを作成します。

テストケースを下記のように設定します。

{
  "keyword": "テスト"
}

AWSLambda

テストケースを保存し実行すると下記画像のようなログが場面に表示されます。

AWSLambda

実行結果が成功と出ていれば無事関数が正常に動作しています。

トリガーにAPI Gatewayを設定

APIの作成

次にトリガーにAPI Gatewayを設定します。

LambdaのコンソールのDesigner部分でトリガーにAPIGatewayを設定しておきます。

AWSAPIGateway

次にAPIGatewayのコンソールで「APIの作成」を選択します。

AWSAPIGateway

API名を設定したらAPIの作成をクリックします。

AWSAPIGateway

リソースの作成

AWSAPIGateway

アクションからリソース名の作成を行います。

AWSAPIGateway

リソース名/リソースパスを設定したら「リソースの作成」をクリックします。

メソッドの作成

AWSAPIGateway

アクションよりメソッドの作成を行います。今回はPOSTを選択します。

AWSAPIGateway

ここで先ほど登録したLambdaの関数名を設定します。

ステージの作成

ここでは「ステージ」を選択しステージの作成を行います。 devステージには開発板をデプロイしていき、releaseステージには安定板をデプロイしていくような運用の仕方が可能です。

AWSAPIGateway

ステージ名を入力したら「作成」を選択します。

AWSAPIGateway

APIKeyを設定

次にAPIKeyを設定するために使用料プランを選択します。

AWSAPIGateway

ロットリング・クォータのチェックを外して次へを選択します。

AWSAPIGateway

APIステージを設定します。

次に「APIキーを作成し使用料プランに追加」を選択するとAPIキーを作成できます。 また既存にAPIキーを発行している場合は「APIキーを使用料プランに追加」から既存のAPIキーを選択できます。

AWSAPIGateway

その後「完了」を選択して終了です。

※APIKeyを使用した認証の有効化はこちらのサイトが詳細を説明してくれています。

dev.classmethod.jp

テスト実行

「メソッド実行」の左上にある「テスト」を選択

AWSAPIGateway

リクエストヘッダーに先ほど作成したAPIKeyを設定しリクエスト本文にlambdaのテストケースと同様に設定します。

AWSLambda

テスト実行しレスポンスに成功のログが吐かれていれば正常実行されています。

デプロイ

AWSAPIGateway

最後にアクションより「APIのデプロイ」を選択して、デプロイ先のステージ環境を選択して「デプロイ」をクリックすると選択肢たステージにデプロイされます。

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版