初投稿の記事です。
私の環境ではEC2ではなくLightsailを使ってます。そして、その上にdocker-composeにてコンテナのDBを動かしています。この状況でLambdaからコンテナ上のDBへとアクセスする方法を探したのですが、ググった感じ日本語の記事など見つからず。
結論としてはVPCにLambdaを入れ、LightsailもVPC Peeringすれば普通にアクセスできました。分かってる人にしてみると、当たり前なのでわざわざ記事するほどでも無いんでしょうね…。
誰向け?
私と同じくAWSを始めたばかりや、初心者向けの内容だと思います。
前提
以下の手順で実施しました。
- Docker上でDBへのリモートアクセス設定。
- LightsailをVPC Peeringする。
- LambdaにVPCを設定をする。
- LambdaからVPC上のDBコンテナへと疎通確認する。
1. Docker上でDBへのリモートアクセス設定。
当たり前すぎて恥ずかしいのですが、実はここでいきなり躓いて疎通確認が上手くいかず時間がかかってしまいました。というのも、私の環境ではコンテナ1(DB)とコンテナ2(App)が動いております。そのためコンテナ同士はポート開放せずとも通信が可能なため、てっきり空いているものと勘違いしていました。
1.1. ポートの確認
以下のコマンドでちゃんとポートが割当てられている確認します
ubuntu@ip-xxx:~$ sudo docker ps
CONTAINER ID PORTS
1a77aa41a892 0.0.0.0:3306->3306/tcp
長いので他ステータスは省略しますが、ここでMySQLのポートが空いていることを確認しましょう。
1.2. DBのアカウント確認
次にDB上でリモートアクセス用のアカウントが作られているか確認します。
ubuntu@ip-xxx:~$ sudo docker-compose exec [コンテナ名] /usr/bin/mysql -uroot -p[rootのパスワード] [DB名]
MariaDB [DB名]> SELECT Host, User FROM mysql.user;
+-----------+----------+
| Host | User |
+-----------+----------+
| % | Useruser |
| % | root |
| localhost | root |
+-----------+----------+
localhost以外のUserが作られていれば、リモートからのアクセスは可能です。
1.3. インターネット経由でのリモートアクセス確認
不正アクセスされても笑って済ませられる環境であれば、ここで一旦、インターネット経由で疎通確認した方が良いと思います。この時点で失敗していると、VPCも何も関係ないですし。
- Lightsailのポートを開放する。
- 好きなMySQLクライアントで接続する。
→LightsailインスタンスのグローバルIPに接続 - 疎通確認後、Lightsailのポートを閉じる。
2. LightsailをVPC Peeringする。
これはLightsail上の設定でVPCピアリングを設定するのみです。なお、今の仕様(2019年11月)ではデフォルトVPCへの接続しか選択肢が内容です。デフォルトVPCを削除しているとエラーが出ました。
3. LambdaにVPCを設定をする。
Lambda側にVPCに関する設定を行いましょう
- LambdaをデフォルトVPC内に入れる。
- LambdaにVPCに関するIAMポリシーを割り当てる。
- VPCのセキュリティグループを確認する。
→デフォルトでは全ポート空いているので特に設定不要でした。
4. LambdaからVPC上のDBコンテナへと疎通確認する。
Lambdaのテストを実行し、エラーなどでなければ終了です。
→LightsailインスタンスのプライベートIPに接続
あとがき
Lambda部分はさらっと書いてますが、初AWSだとここが一番わけわかんないですよね。lambda-uploaderを使っているのでコードだけじゃなくて一緒にアップロードする設定ファイルが特に。
業務が暇なときに私用環境のAWS弄っているのですが、AWS Cliなども入れた開発用のLightsailインスタンスをもう一台立てて遊んでます勉強してます。
社内PCに勝手なツール入れると怒られたり、Proxy認証がある会社なので。