- 1. API GatewayのCustom AuthorizerのLambda関数が呼ばれない
- 2. AWS Lambda入門③(Node編)〜API Gatewayで関数を公開する〜
- 3. Lambda から DynamoDB にアクセス (Node.js)
- 4. AWS Lambda入門②(Node編)〜DynamoDBにアクセスする〜
- 5. AWS Lambdaでデフォルトでは用意されていないコマンドを呼ぶ
- 6. Node.js製Lambdaの速度劣化箇所をX-RAYを使って特定する
- 7. Serverless Framework で AWS Lambda と API Gateway をデプロイする
- 8. 疑似的にNATゲートウェイを停止・起動する
- 9. Lambda から S3 を使う (Python)
- 10. Lambda から S3 を使う (Node.js)
- 11. Serverless NestJS
- 12. 【初心者向け】LambdaとAlexaスキルの連携設定
- 13. 【初心者向け】LambdaでAlexaカスタムスキルと連携する関数を作成
- 14. Cron の外部実行とメール送信の追加 – Nextcloud 環境の構築を通じて AWS での環境構築を体験する⑥
- 15. Serverless Framework lambda 1プロジェクトで複数関数を定義したい
- 16. Next.jsをserverlessでビルドしてawsにデプロイするには(s3, lambda, apigateway, route53)
- 17. Lambda入門#5 Lambdaと連携したAPI Gatewayのバージョン管理
- 18. コロナウイルス対応のため、学習コンテンツの無料開放にひと肌脱いだ話。
- 19. Cognito認証されているAppSyncをIAM認証で後ろから叩く
- 20. Lambda で JSON のパラメタを受け取りたいとき
API GatewayのCustom AuthorizerのLambda関数が呼ばれない
cdkを使ってREST APIを構築しています。
API Gatewayの認証にLamdba関数をカスタムAuthorizerとして使用していたところ、あるタイミングで突然認証が通らなくなってしまった。# 現象
– カスタムオーソライザーのテスト機能では正しく動く(Lambda関数も実行される)
– Postmanからのリクエストでは認証のためのLambda関数がそもそも動かない手動でAPIをマネジメントコンソールからデプロイしたところ動くようになりました。
https://stackoverflow.com/questions/52549538/aws-api-gateway-custom-authorizer-not-invokedcdkのバグなのかな?
開発初期は上手くデプロイできたと思うんだけど、何かの変更が反映されないのか。。。
謎い。それにしてもハマった。
AWS Lambda入門③(Node編)〜API Gatewayで関数を公開する〜
## 概要
– [AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜](https://qiita.com/ozaki25/items/883aec0ab4398aa4abbe)と[AWS Lambda入門②(Node編)〜DynamoDBにアクセスする〜](https://qiita.com/drafts/d3c5b5e6954d5b4af95a/edit)の続編です
– 今回は前回までに作成したLambda関数をAPI Gatewayを使ってHTTPでアクセスできるように公開します## Api Gatewayとは
– API GatewayはAWSが提供するサービスでHTTPでアクセス可能なAPIを作成できるサービスです
– AWSの様々なサービスの呼び出しができるのでクライアントからするとLambdaなどをHTTPアクセスで実行するような感覚で使うことができます## API GatewayでLambda関数を公開する
### Hello関数を公開してみる
– まずは前回までで作ってあるHello関数を公開してみます
– `serverless.y
Lambda から DynamoDB にアクセス (Node.js)
テーブルの一覧
“`js:list_tables.js
var AWS = require(“aws-sdk”);var dynamodb = new AWS.DynamoDB({region: ‘us-east-1’})
var params = { Limit: 100}
exports.handler = async (event) => {
console.log(“*** start ***”)
try {
var data = await dynamodb.listTables(params).promise()
console.log(data)
} catch (ee) {
console.log(ee)
}const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
}
return response;
}
“`テーブルの説明
“`js:describe_table.js
AWS Lambda入門②(Node編)〜DynamoDBにアクセスする〜
## 概要
– [AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜](https://qiita.com/ozaki25/items/883aec0ab4398aa4abbe)の続編です
– 今回はLambdaからDynamoDBにアクセスしてデータを保存したり取得したりしてみます
– テーブルから全件取得、1件取得、1件登録の3つの関数を作成します## DynamoDBとは
– AWSが提供するマネージドなデータベースサービスです
– RDBとは異なりkey-value形式なドキュメントデータベースです## LambdaからDynamoDBにアクセスしてみる
### DynamoDBの設定
– まずはDynamoDBを使うためにServerlesFrameworkの設定をします
#### DynamoDBのテーブル定義の設定
– DynamoDBはデータベースなのでテーブルの作成からはじめます
– これまでと同じようにこれもServerlessFrameworkの機能で行うことができます
– 今回はHelloテーブルを作ってみます
–
AWS Lambdaでデフォルトでは用意されていないコマンドを呼ぶ
# やったこと
AWS LambdaでPythonからgsコマンドを呼んでPDFを結合しました。
# 経緯
業務でPDFの結合を行う必要があって、PythonのPyPDF2を使って結合をする実装になっていました。
しかし、このPyPDF2さんはPDFのファイル構造がPDFのbasicなファイル構造(つまりheaderがあって、bodyがあって、Cross-reference Tableがあって、Trailerがあるみたいなもの)を前提としていて、Cross-reference TableがないとかTrailerがないPDFファイルを結合しようとするとエラーになってしまっていました。
つか、PDFのファイル構造が多少おかしくなってても表示できるようになってるほうがおかしいだろ、やめてくれ
って思ったりもしましたが、ブラウザで表示できてるのに、結合できないのはなんとかしたいということで、なんとかすることに。。。# 環境
AWS Lambda Python3.7# 解決
「ghostscriptをPythonから呼び出すのはどうですか?手元ではいけましたよ」
と聞いたのでさっそ
Node.js製Lambdaの速度劣化箇所をX-RAYを使って特定する
# はじめに
「[お気に入りのテレビ番組の有無を答えてくれるAlexaスキルを作ってみた](https://qiita.com/masaminh/items/1153f34891b1c04b4ee1)」でNode.js製のLambdaを作ったのですが、
>ただ、スキルを呼び出した後、返答が返ってくるまで少しタイムラグがあるのが気になりますね
…
>いずれにしてもX-RAYを仕掛けて、番組表取得で遅くなっているのか、その後の処理で遅くなっているのかなどを見極めたいと思っています。ということで、X-RAYを使って、速度が遅くなっている箇所を特定したいと思います。
# コンソールからの設定
まず最初にコードには手を入れず、LambdaのコンソールからX-RAYの設定をしてみます。
Lambdaのコンソールにて、対象関数の「AWS X-RAY」の箇所のチェックボックスをONにします。
Serverless Framework で AWS Lambda と API Gateway をデプロイする[Serverless Meetup Tokyo #16 (オンライン開催)](https://serverless.connpass.com/event/165352/) を拝見していて、ちょうど今、AWS への各種リソースのデプロイの自動化が課題だったので、よい機会と思い Serverless Framework を使ってみた。
尚、Serlverless Framwork については知っていたが、offline-start しか使ったことがなかった程度の人間です。## やったこと
弊社では Webシステムを、
* フロントエンド: SPA(Angular)
* バックエンド:
* REST っぽいAPI: Lambda + API Gateway
* DB: PostgreSQL 他で組むことが増えてきていて、プロジェクトの取っ掛かり時の環境構築を手動でやっているのがダルくなってきた。
今回は、「REST っぽいAPI: Lambda + API Gateway」のところを Serverless Framework で自動化してみた。## 手順
疑似的にNATゲートウェイを停止・起動する
# VS 使ってないNATゲートウェイの課金
NATゲートウェイは思いのほか使用料金が高く、夜間の開発環境など使用していない時は止めたい。
ただ現在において停止機能は存在しておらず、停止イコール削除となる。
停止という点ではNATインスタンスを立てて停止すれば良い話だが、それでは単純に面倒。せっかくのマネージドサービスは使いたい。
ならば、使用していないときにNATゲートウェイを削除し、使いたいときに必要な情報をもって再作成するスクリプトを作成すればいい。# やりたいことを図にしてみる
![gomi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558188/0b0f391e-afea-597b-dd03-da856764aea1.png)
UMLの書き方は正式に勉強していないので許してほしい。# 停止(削除)スクリプト
“`Python
import boto3client = boto3.client(‘ec2’)
natGateWayList = []
routeTableL
Lambda から S3 を使う (Python)
バケットの一覧
“`py:list_buckets.py
# ——————————————————————
import json
import boto3
print(‘Loading function’)
s3 = boto3.resource(‘s3’)def lambda_handler(event, context):
print(“*** start ***”)
#
it = 1
#
for bucket in s3.buckets.all():
print(str(it) + ‘:’ + bucket.name)
it += 1return {
‘statusCode’: 200,
‘body’: json.dumps(‘Hello from Lambda!’)
}# ——————————————–
Lambda から S3 を使う (Node.js)
バケットの一覧
“`js:list_buckets.js
‘use strict’const AWS = require(‘aws-sdk’)
var s3 = new AWS.S3()exports.handler = async (event) => {
console.log(“*** start ***”)
try {
var data = await s3.listBuckets().promise()
console.log(data.Buckets)
} catch (ee) {
console.log(ee)
}const response = {
statusCode: 200,
}return response
}
“`バケット内のファイルの一覧
“`js:list_files.js
// —————————————————————var A
Serverless NestJS
NestJSを利用したLambda&API GatewayのServerlessをやってみます。
注意点としては、NestJSはExpress.jsと比較すると重いフレームワーク(フルスタック)なので、起動に時間がかかってしまい、あまりサーバレスに向いているとは言えないです。
が、個人で利用する場合や社内系のアプリケーションの場合などは、サーバレスだと安くて試しやすいと思うので、是非使ってみてください。## NestJSプロジェクト作成
いつものやつです。
ひとまずローカルでHello Worldができる状態にします。### プロジェクト作成
“`console:
$ nest new nest-serverless-test
“`### 動作確認
“`console:
$ cd nest-serverless-test
$ npm run start
~ 中略 ~
[Nest] 3935 – 2020-02-29 19:19:07 [NestApplication] Nest application successfully started +1ms
`
【初心者向け】LambdaとAlexaスキルの連携設定
#LambdaとAlexaスキルの連携設定
前の記事:[LambdaでAlexaカスタムスキルと連携する関数を作成](https://qiita.com/kurisaka/items/00451cb7d5551a79b68d)
###スキルIDの表示
スキルの一覧に戻り該当スキルの「スキルIDの表示」を押下する
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/a0fca7a0-06cb-0557-a79a-3d15788a645c.png)###スキルIDのコピー
表示されたスキルIDをコピーしておく
![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/df876165-d394-b9a1-19f0-269fb1abd735.png)###Lambdaトリガーの設定
Lambdaに戻り「Designer」を開き「トリガーを追加」を押下
![4-3.png](https:
【初心者向け】LambdaでAlexaカスタムスキルと連携する関数を作成
#Lambdaで関数を作成
##AWS Lamdaで関数の作成手順前の記事:[Alexaでカスタムスキルを作成する](https://qiita.com/kurisaka/items/24f5dfe54d718e33c1c2)
###AWSのサービス一覧から「Lambda」を選択
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/8b1086ea-874c-e37a-2791-e3d79805ba05.png)###Lambdaトップ画面より「関数の作成」を押下
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/1dd290a0-44b2-bc01-ecd7-b804ca331963.png)###関数の基本情報を設定
– 「一から作成」を選択
– 「関数名」を入力 →今回は”sampleFunction”としました
– 「ランタイム」では「Python3
Cron の外部実行とメール送信の追加 – Nextcloud 環境の構築を通じて AWS での環境構築を体験する⑥
「Nextcloud 環境の構築を通じて AWS での環境構築を体験する」 の第 6 回となります。
これまでの記事は下記からどうぞ。* 【第 1 回】[EC2 と RDS を利用した Nextcloud 環境の構築](https://qiita.com/S_Katz/items/756ca04ecece844ce503)
* 【第 2 回】[ElastiCache サービスの導入](https://qiita.com/S_Katz/items/280642e437c709052781)
* 【第 3 回】[EFS ファイルサーバーへの移行](https://qiita.com/S_Katz/items/5b5f37db29c3f800e610)
* 【第 4 回】[ALB を利用したサーバー負荷分散、可用性向上に向けた取り組み](https://qiita.com/S_Katz/items/edadf33755c0d834eb46)
* 【第 5 回】[分散した EC2 インスタンスのログの集約](https://qiita.com/S_Katz/items/2fa740c505
Serverless Framework lambda 1プロジェクトで複数関数を定義したい
Serverless Frameworkを使って1プロジェクト内にlambdaの複数関数を用意するには、どうしたらいいの?(TypeScriptで)ということで、簡単にserverless.ymlとプロジェクトの構成を解説していこうかなと思います。
# プロジェクト構成
今回はhandler.tsとhandler2.tsにそれぞれ一つづつ関数を定義しています。
# serverless.yml
lambdaの関数を複数定義したい場合は、serverless.ymlのfunctionを複数書けばいいだけ。
すごく簡単。“`yaml
functions:
hello:
handler: handler.helloWorld
Next.jsをserverlessでビルドしてawsにデプロイするには(s3, lambda, apigateway, route53)
## 概要
筆者が当初ざっくりと考えていたのは「Next.jsをLambdaにデプロイしたい・デプロイを自動化したい」だったのですが、これに結構苦戦したのでそのまとめと言ったところです。
この記事はaws初学者には意味がわからないと思うので、以下に登場ワードを書いておくのでまずはそちらをある程度調べてから挑戦した方がいいかと思います。
– S3
– Lambda
– API Gateway
– Route53
– ACM
– IAM
– Role
– Policy## 注意点
まず、ただ単に「Next.jsで作ったものを公開したい」だけであれば、AWSに限定する必要は全くないです。[ZEIT Now](https://zeit.co/docs#)を使えばいいと思います。
同じようなことをするためのライブラリで[Serverless Nextjs Component](https://github.com/danielcondemarin/serverless-next.js)と言うのがあります。今回やることはこれに近いので、実際問題これを使ってもいいのかもしれ
Lambda入門#5 Lambdaと連携したAPI Gatewayのバージョン管理
さぁ、今日もlambdaを触っていきます!
# 参考URL
クラウドメソッドさんの記事を参考にしてやってます。APIゲートウェイのバージョン管理(lambda連携)
## 前回までのおさらい lambdaのエイリアス設定
最初の状態ではAPIゲートウェイに紐づいている“`$LATEST“`の結果が返ってきます。
では、実際に紐づけを行う前に“`$LATEST“`がどのようになっていて、エイリアスでprodステージとdevステージとの違いが分かるように整理しておきます。そこでちょっと、おさらいなのですが、lambdaのエイリアスとバージョン管理の方法にも触れておきます。
__1.lambdaでバージョンを作成__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/00474acb-d2f
コロナウイルス対応のため、学習コンテンツの無料開放にひと肌脱いだ話。
##0.まえおき
新型コロナウイルスによる、学校の休校を受け、
教育業界において、コンテンツの無料開放などが流行っています。そんなさなか、とある老舗の参考書出版会社さまから、
コンテンツ無料解放をしたいと相談を受けたのが金曜日の夜。。。すばらしい社会貢献!
ひと肌脱ぐことになり、私の休日(ほぼ徹夜)は消え去りました。
(えぇ、もちろん私も無償奉仕です。)##1.要件/状況
**・PDFの書籍データがある**
**・誰にでも見せたいけど、ダウンロードとか印刷をされてしまっては困る。**
(過度には誰にも見せたくない、、、)
**・サーバとか何もない**という、本当にゼロからのスタートです;;
##2.実現方法概要
**1.PDF(URL)の保護**
Cognito認証されているAppSyncをIAM認証で後ろから叩く
# Cognito認証されているAppSyncをIAM認証で後ろから叩く
## はじめに
以前、サーバーレスWebアプリハンズオン記事として「[AppSyncをフロントエンドとバックエンドで利用する](https://qiita.com/w2or3w/items/70f6b6d8d13b60afaee5)」を投稿しました。
ここでは認証モードとして当然のように「API Key」を利用していました。
このAPI Keyでの認証、初学者がまず使ってみる場合や簡易的なプロトタイプとして利用する分には良いのですが、安全性や有効期限が最大365日という更新の手間のことを考えると、なるべく他の認証モードを採用すべきです。
![ink (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/64258f88-1be7-dd53-15a0-33183dd681c6.png)
その鍵、見えてますよ、、。
365日後に鍵の更新、絶対忘れますよ、、。## AppSyncの認証モードの種類
AppSyncはA
Lambda で JSON のパラメタを受け取りたいとき
## やりたいこと
API Gateway 経由で、POSTリクエストの Body (JSON) の値を Lambda で受け取りたい
## 解決
API Gateway マッピングテンプレート を設定する
### くわしく
1. 該当のメソッド実行の総合リクエエスト
2. 本文マッピングテンプレート
3. テンプレートが定義されていない場合 (推奨)
4. マッピングテンプレートの追加`application/json` の key に `$input.json(‘$’)` の value を設定する