質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

2400閲覧

RDS AuroraからLambdaが呼べない

yu-na

総合スコア27

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2019/06/14 05:56

編集2019/06/14 06:28

Auroraのtestテーブルにinsertをしたら、lambdaが呼ばれる仕組みを検証しております。
フローとしては、

MySQL [agent]> desc test; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | text | YES | | NULL | | +-------+---------+------+-----+---------+----------------+

このようなテーブルがあり。
以下のようなtriggerとprocedureがあります。

▼trigger DELIMITER ;; CREATE TRIGGER TR_test AFTER INSERT ON test FOR EACH ROW BEGIN SELECT CONCAT('New test from ', NEW.id), NEW.name INTO @id, @name; CALL ES_Send_Record(@id, @name); END ;; DELIMITER ; ▼プロシージャ DROP PROCEDURE IF EXISTS ES_Send_Record; DELIMITER ;; CREATE PROCEDURE ES_Send_Record (IN id integer, IN name TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async('arn:aws:lambda:ap-northeast-1:000000000:function:test-lambda', CONCAT('{ "id" : "', id, '", "name" : "', name, '" }') ); END ;; DELIMITER ;
  1. insert into test(name) values('test');でテストデータを投入
  2. triggerが走り、procedureが呼ばれて、procedureの中でlambdaをキックします

また、RDSには以下のロールが割り当てられていることは確認できます。

MySQL [agent]> show variables like '%_role%'; +----------------------------+--------------------------------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------------------------------+ | aurora_load_from_s3_role | | | aurora_select_into_s3_role | | | aws_default_lambda_role | arn:aws:iam::000000000:role/trigger-procedure-call-lambda | | aws_default_s3_role | | +----------------------------+--------------------------------------------------------------+

※独自にパラメータグループがクラスタに割り当てており、そのパラメータグループのaws_default_lambda_roleの値に実行させたいLambdaのarnを設定しております。

しかし、実際にinsertすると、

MySQL [agent]> insert into test(name) values('test'); ERROR 63996 (HY000): Lambda API returned error: Missing Credentials: Cannot instantiate Lambda Client

となってしまいます。。。
どこの何を修正すればLambdaが実行できるようになるのでしょうか。。
ご教示頂けますと幸いです。

[追記]
パラメータグループのロールを外して、つけ直したら状況変わりました。

MySQL [agent]> insert into test(name) values('test'); ERROR 63996 (HY000): Lambda API returned error: Network Connection. Unable to connect to endpoint

[さらに追記]
FullAccessLambdaのロールに切り替えたらNetworkのエラーに変わりました。
ロールの付け替えは即時とあるけど、show variableで見たほうが良い。ラグがある。

また上記だけでなく、クラスターのIAMロールの管理で「LambdaFullAccess」のロールもつけないと、また「Missing Credentials」に戻りました。

RDSクラスターのIAMは、クラスタ詳細画面の「IAMロールの管理」なのか、パラメータグループなのか、どっちがどっちなのか理解不能です。。

[追記]
NetworkErrorはRDSをprivate subnetに配置しているため。
NAT Gatewayで内から外の通信のみを許容する

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ほとんど自己解決に近づいている気がしますが、補足として回答します。
既に検証済だったらすみません。

Lambdaとの接続は外部(インターネット経由)でしょうか、内容を見る限りはVPC内で接続させても良いように見えています

以下あたりを参照して接続できませんでしょうか
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc.html
https://devlog.arksystems.co.jp/2018/04/04/4807/

2つ目の参照先にもあるようにVPC内で接続する場合は、セキュリティグループとIAMロールの追加設定が必要です。

投稿2019/06/15 04:12

kotatu

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu-na

2019/06/19 03:11

ごめんなさい。自己解決したまま放置してました。。 Lambdaとは外部です。VPCには含めておりませんでした。 そして私を混乱させていた要因はやはりRDSにロールを付与する手順でした。 ・パラメータグループで対象のlambdaを指定する ・詳細画面のロールでlambda実行権限を付与する この棲み分けを理解できていなかったです。 (ドキュメント何回読んでもわかりにくいなとは思うのですが、、、) ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問