93360


aws-lambdaでlinebotを作成したいと思っています。  
その中でaws-rdsで作成したデータベースにPyMySQLで接続しようとこちらのコードを書いたところ、エラーになってしまいました。

[code]

    def pickupDatabase():
        rds_host  = "rdsのエンドポイント"
        name = rds_config.db_username
        password = rds_config.db_password
        db_name = rds_config.db_name
        
        conn = pymysql.connect(host=rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
        msg = ""
        item_count = 0
        
        with conn.cursor() as cur:
            cur.execute("select * from content")
            for row in cur:
                item_count += 1
                #logger.info(row)
        conn.close()
        
        return "Added %d items from RDS MySQL table" %(item_count)
        
        
    
[/code]

**試してみたこと**  
1.ロールの確認  
(参考サイト：https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-rds-
tutorial.html)  
→参考サイトの実行ロールを作成するというところを参考に作ったのですが変わりませんでした。

2.rds_configの中身を取り出せているかを確認  
→取り出せていました。間違えてないことも確認済みです。

**表示されたエラーメッセージ**

> [ERROR] OperationalError: (2003, "Can't connect to MySQL server on 'test-
> database.cpstxnucpjex.ap-northeast-1.rds.amazonaws.com' (timed out)")

エラーの原因はデータベースに接続できなかったことだと思うのですが、調べてVPN設定などもしてみたのですがうまくいきません。  
初心者質問で恐縮ですが、この場合の確認事項、よくある修正方法など教えてほしいです。  
よろしくお願いします。


CC BY-SA 4.0
2023-01-03T07:20:00.443
93162
2023-01-15T13:45:46.083
46953
question
aws aws-lambda amazon-rds
awsでlambda関数からrdsに接続できない


エラーメッセージからすると、認証の前にネットワークレベルで接続できていないのではないかと思われます。

RDS は VPC 内に配置されるサービスで、Lambda はデフォルトでは VPC
外に配置されるサービスです。ですのでネットワークが接続できるには二つの方法があります。

  * Lambda に VPC を割り当てる
  * RDS を Public access 可能にする

後者は一般的におすすめではないため、前者がおすすめです。Lambda に VPC を割り当てる方法は以下に書かれています。

<https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html>

注意としては、Lambda からインターネットにアクセスできる必要がある場合です。VPC を割り当てると、Lambda からインターネットへのアクセスも
VPC 経由となり、NAT Gateway が必要になります。


CC BY-SA 4.0
2023-01-05T02:11:28.183
93189
2023-01-05T02:11:28.183
5959
93162
answer


正しいのかはわかりませんがセキュリティグループのIPアドレスを0.0.0.0/0にしたら無事つながるようになりました。  
参考URL:<https://creepfablic.site/2021/06/07/aws-rds-mysql-client-
python/#index_id1>


CC BY-SA 4.0
2023-01-09T13:52:15.510
93268
2023-01-09T13:52:15.510
46953
93162
answer


解決したのでさらに追記で回答します。  
Lambdaで接続しているセキュリティグループのアウトバウンドルールとインバウンドルールにVPCのサブネットのCIDRを追加したらうまく動くようになりました。

<https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-rds-
connection-timeouts/>  
上記URLのセキュリティグループのルールを確認するというところを見逃してしまっていたようです。  
失礼いたしました。


CC BY-SA 4.0
2023-01-15T13:45:46.083
93360
2023-01-15T13:45:46.083
46953
93162
answer