🐈

TypeScriptで作成した関数をAWS Lambdaにzipファイルでデプロイする

2022/10/29に公開約3,600字

この記事でやること

  • AWS CLI で IAM ロールを作成する
  • AWS CLI で Lambda 関数を作成する
  • TypeScript で Lambda 関数を書く
  • TypeScript を JavaScript にトランスパイルする
  • トランスパイルされたコードを AWS CLI で Lambda にアップロードする
  • Lambda 関数を実行する
  • TypeScript を修正して、Lambda の関数を更新する

AWS CLI で IAM ロールを作成する

lambda-execute という IAM ロールを作成します。

aws iam create-role --role-name lambda-execute --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

create-role は AWS に新しいロールを作成するコマンドです。

コマンド実行後、以下のようなレスポンスが返ってきます。

{
  "Role": {
    "Path": "/",
    "RoleName": "lambda-execute",
    "RoleId": "AROA2QGSZAUCDUOCDSUEWZUEH",
    "Arn": "arn:aws:iam::1829967232694291:role/lambda-execute",
    "CreateDate": "2022-10-29T14:32:49+00:00",
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  }
}

コンソールで IAM のロールを見ると、lambda-executeというロールが作成されています。

ちなみにこの手順はAWS CLI での Lambda の使用に載っています。

ロールにアクセス許可を追加する

AWSLambdaBasicExecutionRoleマネージドポリシーを追加します。

AWS マネージドポリシーは、AWS が作成および管理するスタンドアロンポリシーです。
スタンドアロンポリシーとは、ポリシー名を含む独自の Amazon リソースネーム (ARN) の付いたポリシーです。

aws iam attach-role-policy --role-name lambda-execute --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

AWS CLI で Lambda 関数を作成する

TypeScript + Node.js + ESLint + Prettier の環境をとにかく早く構築するの記事のような、TyepScript の基本的な開発環境はできているものとします。

@types/aws-lambda をインストールします。

npm install -D @types/aws-lambda

index.ts に以下のコードをコピペします。

src/index.ts
import {Context, APIGatewayProxyResult, APIGatewayEvent} from 'aws-lambda';

export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
  console.log(`Event: ${JSON.stringify(event, null, 2)}`);
  console.log(`Context: ${JSON.stringify(context, null, 2)}`);
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'hello world',
    }),
  };
};

build コマンドを実行すると、dist 以下に index.js が作成されます。

npm run build

Deploy transpiled TypeScript code in Lambda with .zip file archives

zip で JavaScript ファイルを圧縮する

cd dist && zip function.zip index.js

Lambda 関数を作成する

aws lambda create-function --function-name sample-function \
--zip-file fileb://function.zip --handler index.handler --runtime nodejs16.x \
--role arn:aws:iam::xxxxxx:role/lambda-execute

ここでの arn:aws:iam::xxxxx:role/lambda-executeの値は IAM > ロール > lambda-execute で取得できます。

以下のコマンドで作成した関数一覧をリストにして確認できます。

aws lambda list-functions --max-items 10

Lambda 関数を実行する

aws lambda invoke --function-name sample-function out --log-type Tail

AWS コンソールからも実行できます。

ログは CloudWatch Logs に出力されます。

Lambda 関数を更新する

関数を修正して再度 Lambda にアップロードしたい場合は、以下のコマンドを実行します。

aws lambda update-function-code --function-name sample-function \
--zip-file fileb://function.zip

Lambda 関数を削除する

aws lambda delete-function --function-name sample-function
GitHubで編集を提案

Discussion

ログインするとコメントできます