カテゴリー
AWS

Amazon RDS(Aurora)を定期的に止めたいンゴ

AWSは何にコストがかかるかって言ったら、そらもう(RDSが群を抜いて)あれ(かかる)よ。便利やからね。はっきりわかんだね。

せやけどね、検証環境や開発環境は一年中稼働してる必要はないわけやから、時間を決めてね、止めておきたい。

というわけでね、Lambda使ってね、やってみるで。

まずRoleを作る。

まず、lambda.amazonaws.comが信頼されたエンティティやね。

ほんで、ポリシーとしては、次が必要かな。

  • rds:StartDBCluster
  • rds:StopDBCluster
  • rds:DescribeDBClusters

本番止めてしまったら、そんなもん、オマエ…。

と言うわけで、リソースにはちゃんと対象のARNを指定しておくとええね。

そしたら、Lambda作るで。ランタイムはPython3.8で、実行ロールにはさっき作ったロールを指定する。ちな、RDSはAuroraや。

import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.describe_db_clusters(DBClusterIdentifier=くらすたーの識別子)
    for DBCluster in response['DBClusters']:
        if DBCluster['Status'] == "available":
            client.stop_db_cluster(DBClusterIdentifier=くらすたーの識別子)

これは止める方。次、動かす方や。

import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.describe_db_clusters(DBClusterIdentifier=くらすたーの識別子)
    for DBCluster in response['DBClusters']:
        if DBCluster['Status'] == "stopped":
            client.start_db_cluster(DBClusterIdentifier=くらすたーの識別子)

これだけやね。あとは、それぞれの関数のトリガーにイベントを設定する。今は、「EventBridge (CloudWatch Events)」になっとるんやね。

ルールタイプをスケジュール式にしたときの設定方法は正直意味わからんので、https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.htmlを参照するんやで。

これで、好きなタイミングでRDSを止めたり動かしたりできる。最高や。

カテゴリー
AWS

ReactをS3のSiteHostingで配信する方法

ReactビルドしてS3バケットに配置すればええだけやん。

と、思うやん?

そら(ちゃんとトップページからアクセスして、リンク全部踏んでったら)そう(ええと思うし、あとSPAとかはね、問題ない)よ。

せやけど、リロードとかさ、するやん?人間だもの。

S3にはindex.htmlしかない訳やから、ReactのルーティングでURL(location)が変更されてる状態でリロードしたら、404になる訳なんよね。例えば、”/giants” みたいなルーティングをReactで実現してたとしても、そらそんなディレクトリない訳やから。

そう言う時の話やね。アパッチとかエンジンエックスやったらリライトルールでなんとかするんやけども、S3のhostingん時はどうすんねんって。

ちょっと調べるといろんな解決方法があって、まず一番簡単なのが、errorオブジェクトをindex.htmlにするって言う。

https://stackoverflow.com/questions/51218979/react-router-doesnt-work-in-aws-s3-bucket

最初見た時は何や天才やん。と思ったよね。

これならだいたいindex.htmlにルーティングされるから、意図したReactのルーティングになる。確かに。せやけど。これ、確かに、動き的にはええんやけど、実際は、HTTPステータスが404のまま動いてる感じなんよね。

なんかちょっと気持ち悪いかなって。

次見つけたの。

出たわね。

これもうすごい。ルーティングをハッシュ付きのやつに置き換えてくって言う作戦。確かに、これならindex.htmlで全部処理できるからね。天才アンド天才。すごい。

React側のコードにも手を入れる必要があるので、お手軽さで言えば最初の方なんやけども、こっちは綺麗に解決できる感がある。

なんてすごいんだ……(恍惚

カテゴリー
AWS

AWSのクライアントVPNエンドポイントを使ってみる

なんやVPNって全然わからんで…。

せやからAWSを使ってやってみるンゴねぇ…。

まずは、なんでVPNかって話なんやけども、AWSに作ったVPCの中身にプライベートにしたいっちゅうことやね。ほんなら、VPCにVPNで繋いだったらええやんってことらしいで。

ネット上によくあるVPNの説明図見てると、確かに、どこかを経由してどこかに繋がるみたいな、そんな感じやね。
その経由するところを、AWSやとクライアントVPNエンドポイントっちゅうのを利用して実現できるみたいや。

わい <=> クライアントVPNエンドポイント <=> VPC

的な話やな。ほんまにできるんやろか…。

まずは、普通にVPCを作って。

次に、クライアントVPNエンドポイント作ってみるで。

クライアント IPv4 CIDRってなんやねん…

VPCのCIDRとルートが重複しなければいいらしい。としか書いてないんやが…、適当でよさそう…、ほんまに?

次にサーバー証明書がいるみたい…。どないすんのこれ。

普通にCertificateManagerで証明書を作るか認証局を建てるか、どこかで作った証明書をインストールするかみたいなことらしい。

そこで、どうやらec2で自前の認証局を作ったらいいみたいなことがどこかに書いてあった。

その通りにしてみる。

おもむろにAmazon Linux2を起動して、こいつに認証局として動作してもらうで。

手順はこ↑こ↓を参考に。「OpenVPNの設定」の前までやって、サーバー用とクライアント用の鍵っぽいのを集める。

https://qiita.com/kapioz/items/5b75c3470a4e57d916ba

ca、サーバー用のcert、サーバー用のkeyを用意して、Certificate Managerで証明書のインポートを行う。

こ↑こ↓

証明書本文 : cert
証明書のプライベートキー : key
証明書チェーン : ca

ちな、リージョンに注意。

これが終わったら、クライアントVPNエンドポイントの作成に戻ろう。

認証オプションに相互認証を指定して、サーバー証明書 ARN*、クライアント証明書 ARN*、どちらにも先ほどインポートした証明書のARNを指定する。

できたら、このエンドポイントを接続したいサブネットにアタッチする。セキュリティグループを設定し、認証タブで、接続を許可するIPアドレスをCIDR表記で指定する。

これで準備完了。

クライアント設定のダウンロードでクライアント VPN エンドポイントの VPN クライアント設定ファイルをダウンロードし、↑で作っておいたクライアント用のcertとkeyを追記する。

これで、VPN接続ができるようになる。

ようわからんが、TunnelblickっちゅうのがMacやと鉄板なんかな?そいつに設定ファイルをポイーで、VPN接続に成功したで…!

なお、VPNに接続した状態でインターネットに出ていけるようにするには、別途設定が必要の模様や。ルートテーブルで0.0.0.0/0を外に出ていけるサブネットにターゲットしたらええんやな。

が、プライベートなところにアクセスできればいいのであればこれで充分みたいや。確かに、プライベートなIPでさっきのインスタンスとかにも接続できたし。できてる。VPNできてるで。

もう、SSHで踏み台してとかいう時代じゃ無いんか、もしかして…?