Help us understand the problem. What is going on with this article?

AWSCDKがGAになったのでAPIGateway+Lambdaをデプロイしてみる

はじめに

以前から気になってアップデートを追いかけていた AWS CDK がついにGAになりました :tada:
https://aws.amazon.com/jp/blogs/aws/aws-cloud-development-kit-cdk-typescript-and-python-are-now-generally-available/

AWS CDK とはAWSが公式でメンテしている AWS構成管理ツール です
大きな特徴としては、TypeScriptやPythonからCloudFormationのテンプレートファイルを生成してくれるという点です。
今まで半泣きになりながら書いていたYAMLファイルを、もう書かなくてもいいってことですw
特に普段からTypeScriptを使っている自分に対しては、ほんとにどストライクなツールでした…
ただ開発者プレビューということで、アップデートされるたびに破壊的な変更が発生して、アップデートを追いかけるのが大変だったのだけ覚えています…
そんな AWS CDK がGAになったということで、AWS上にRESSTAPIを構築する際の鉄板構成である「APIGateway+Lambda」をCDKでデプロイしてみようと思います!

環境構築

AWS-CDK インストール

$ npm i -g aws-cdk

プロジェクト作成

$ mkdir cdk-demo
$ cd cdk-demo
$ cdk init app --language=typescript

これでTypeScriptでCDKを書いてく準備ができました

書くぞ!!!

ということで今回は TypeScript で書いていきます

qiita_api_lambda.ts
import cdk = require("@aws-cdk/core")
import { Function, Runtime, Code } from "@aws-cdk/aws-lambda"
import { RestApi, Integration, LambdaIntegration, Resource,
  MockIntegration, PassthroughBehavior, EmptyModel } from "@aws-cdk/aws-apigateway"

export class QiitaAPILambda extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    // Lambda Function 作成
    const lambdaFunction: Function = new Function(this, "qiita_demo", {
      functionName: "qiita_demo", // 関数名
      runtime: Runtime.NODEJS_10_X, // ランタイムの指定
      code: Code.asset("lambdaSoruces/demo_function"), // ソースコードのディレクトリ
      handler: "index.handler", // handler の指定
      memorySize: 256, // メモリーの指定
      timeout: cdk.Duration.seconds(10), // タイムアウト時間
      environment: {} // 環境変数
    })

    // API Gateway 作成
    const restApi: RestApi = new RestApi(this, "QiitaDemoAPI", {
      restApiName: "QiitaDemoAPI", // API名
      description: "Deployed by CDK" // 説明
    })

    // Integration 作成
    const integration: Integration = new LambdaIntegration(lambdaFunction)

    // リソースの作成
    const getResouse: Resource = restApi.root.addResource("get")

    // メソッドの作成
    getResouse.addMethod("GET", integration)

    // CORS対策でOPTIONSメソッドを作成
    getResouse.addMethod("OPTIONS", new MockIntegration({
      integrationResponses: [{
        statusCode: "200",
        responseParameters: {
          "method.response.header.Access-Control-Allow-Headers":
            "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'",
          "method.response.header.Access-Control-Allow-Origin": "'*'",
          "method.response.header.Access-Control-Allow-Credentials": "'false'",
          "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE'",
        }
      }],
      passthroughBehavior: PassthroughBehavior.NEVER,
      requestTemplates: {
        "application/json": "{\"statusCode\": 200}"
      }
    }), {
      methodResponses: [{
        statusCode: "200",
        responseParameters: {
          "method.response.header.Access-Control-Allow-Headers": true,
          "method.response.header.Access-Control-Allow-Origin": true,
          "method.response.header.Access-Control-Allow-Credentials": true,
          "method.response.header.Access-Control-Allow-Methods": true,
        },
        responseModels: {
          "application/json": new EmptyModel()
        },
      }]
    })
  }
}
cdk-app.ts
import "source-map-support/register"
import cdk = require("@aws-cdk/core")
import { QiitaAPILambda } from "./qiita_api_lambda"

const app: cdk.App = new cdk.App()
new QiitaAPILambda(app, "QiitaAPILambdaStack")
app.synth()

デプロイする

TSをJSにtscでコンパイルしてデプロイコマンドを実行するだけです

$ yarn build
$ cdk deploy

さいごに

どうですか?簡単でしょう?(語彙力w)
ちなみに cdk synth というコマンドを実行すると、jsonのCFnテンプレートがローカルに生成されます
これを見てどのように変換されているのか確認するのもいいかもしれません
ではまた!!!

is_ryo
(IoTチョットワカル)フロントエンドエンジニア。 Vue.js / AWS / GraphQL / Serverless
https://is-ryo.com
acall
「Life in Work and Work in Life for Happiness」をビジョンに掲げ、様々なワークスペース、ハードウェア、ソフトウェアを統合して"はたらく"の体験を向上するWorkstyleOSを通じ、暮らしと仕事の幸福度の最大化と追求します。
https://www.acall.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした