[Rails] sitemap_generatorのsitemap作成でAws::S3::Errors::AccessDenied: Access Denied

sitemap_generator gem

sitemap作成でハマったのでメモ。Herokuで動的なsitemapを作る一つの方法として、s3を使ったsitemap配信があります。ググれば、たくさんブログなどあるのですが、aws-sdkのバージョン2を使ったものがメイン。今回はaws sdk version3で構築してたのでAws::S3::Errors::AccessDenied: Access Deniedが出て時間を無駄に消費しました。

require 'aws-sdk-s3'が必要なのはissueを漁ればわかりました。

Aws::S3::Errors::AccessDenied: Access Deniedですが、s3のバケットをpublicにしていないと出ていました。なので、コンソールから下記を追加すればOK。

Rails経由でAWS Lambda(ruby)を使いファイルをs3にアップロードする方法

タイトルが渋滞していますが、、やったことは下記のこと。

  1. Railsが非同期ジョブ走らせる
  2. 非同期ジョブはlambdaをinvokeする
  3. lambdaがcurlでファイルを持ってきて、s3にアップロードする
  4. その結果のアップロード先URLをRailsのDBに保存

AWS Lambdaを触ったのは初めてです。nodeではなくrubyで動かします。まずは、AWS上にLambda関数を作ります。今回は、コードは短いだろうと予想し、ローカルにインストールせずにAWSのWEB UIのエディタを使いました。

Role 追加

登場ロールは2つ、Rails側でlambdaをinvokeするロールとlambda関数を走らせるロール

Rails側でlambdaをinvokeするロール

*全部必要ではないかもしれませんが、面倒なので全て権限をあげました。

lambda関数を走らせるロール

Rails側のコード

AWS Ruby SDK version2 です。RequestResponseだと同期で処理します。返り値を拾うためにもここは同期で処理。invoke_copy自体を非同期で走らせるイメージです。

Lambda関数のコード

AWS Ruby SDK version3です。Lambdaの/tmpのみがwritableな場所で、maxで512MBです。
したがって、これ以上コピーできません。

[AWS] EFSのマウント方法

EFSのルートを/etc/letsencryptをマウントする方法は、

1. パッケージのインストール (Ubuntuの場合)

2. 下記を/etc/fstabに記述する

3. セキュリティグループの作成

EFSサイドは2049 inboundをオープン。EC2側は2049のoutboundをオープン(outboundは基本全オープンだと思う)

4. 該当ディレクトリを作成し、fstabのReload

ruby/railsでEBS volumeを作る方法

AWS version3でebs volumeを作るのはドキュメント通り。

RubyでAWS Route53にレコードを追加/削除する方法

Aws ruby version3 での話です。CLIはjsonを作らないといけなそうですが、rubyだとそこが必要ないので楽。UPSERTはドキュメントによると無ければCREATE、あればUPDATEとのこと。
またactionにDELETEを指定することでレコードを削除できる。

AWS Ruby SDKでCost Exploreの情報を取得する方法

aws-sdk version3での話です。

1. aws-sdkのCost Exploreのモジュールを読み込む

2. IAMユーザに請求情報のアクセス権を与える

上部のナビバーのアカウントをクリックして、請求情報のアクセスのeditをクリックしてIAMアクセスのアクティブ化をチェックして保存。

3. IAMユーザに必要なロールを設定して追加する

下記のロールを作成し(今回はGEtCostAndUsageのみ)、該当ユーザでロールを追加する

4. REPLでテスト

Rails cでコンソールを呼び出しテスト。各キーは設定済みとする。

初期化。us-east-1でのみ提供されている

BlendedCostとUnblendedCostの差がわかりづらい。Unblendedの方が割引などを除いた実際の数値に近いという理解で良いのか。

ドキュメントを読み試行錯誤の結果、タグに紐づいたコストを引くことができた。

注意

Cost ExploreのAPIリクエストにはお金がかかりそう。。

AWS CLIでNVMe利用インスタンスから外部EBSボリュームをマウントする方法

AWSのEC2インスタンスでは最近高速SSDのNVMeを採用しているインスタンスタイプがある。

NVM Express (NVMe) もしくは NVMHCI (Non-Volatile Memory Host Controller Interface) は、PCI Express (PCIe) を通じて、不揮発性ストレージメディアを接続するための論理デバイスインターフェースの規格であり、シリアルATAに代わる次世代の接続インターフェース規格である。

引用元 :https://ja.wikipedia.org/wiki/NVM_Express

これを利用しているインスタンスでは下記のように/dev/nvme0n1p1のようなデバイスになっており、従来通りにAWS CLIで自動マウントしようとすると失敗する。

AWS CLIではまず xvdbをAttachし、利用できるようになるのを待ち、マウントする。

昔ながらとNVMeをサポートするコマンドは、下記のような感じ。

[Cloud IDE] AWS Cloud9ファーストインプレッション

Cloud9

一番有名どころのCloud IDEです。 AWSに買収されてAWSのファミリーとしてCloud9を利用することができます。
今から登録するとAWSに統合されたCloud9にリダイレクトされますが、買収前のCloud9も依然として利用することができます。(会社の一人の開発者も前のCloud9を利用中です)

一言でまとめると”EC2インスタンスについたIDEの皮”だと思います。

EC2を利用していた人にはとっつきやすいですが、設定時にAWSワードがでてくるので知らない人は勉強する必要があります。将来的に知っておいて損はないのでここから始めるのも手だと思います。これがAmazonが買収した意図かもしれません。

スクショでみていきましょう。

Tokyoリージョンは選べない

3ステップの環境設定

セカンドステップでAWS用語のec2やt2.microなどがでてくる。プログラムを書くという目的のためにインフラを知る必要があるのかどうかは疑問だ。逆に知っている人はサクサクいける。t2.microの1Gメモリじゃアプリ乗ってもスワップしまくって作業にならないとか。



初期起動は2,3分ぐらいかかる

ec2インスタンスだしそのぐらいかかるよね。

デフォルトでEC2インスタンスに直接sshは不可

普通のt2.microインスタンスです。セキュリティグループであるサブネットのsshしかデフォルトオープンしてない。そして、keyが設定されてないのでCloud9のインスタンスの直接サーバ化には、インスタンス自体のsshサーバの設定を変更して、sshをパブリックにオープンする必要がありそう。


美しいUIと多岐にわたる設定

ACE editor。オープンソースのAceエディタにはドキュメントがあまりなくここまで綺麗にするには独自のノウハウor凄まじい時間をかけてアダプトしたのか(戦々恐々)。Ace editorのテーマはサポートされていてそれにあうUIも良い感じ。これを使いこなすのはまた別途勉強が必要。プラグイン機構がなさげなのが残念。

再開時に30秒ほどかかる

30分利用しない(デフォルトが30分。変更可能)とEC2インスタンスが停止し、課金が止まる。したがって、停止から再開に30-40秒ほどかかる。

まとめ

  • ブラウザ一つで開発が進められる。
  • UIは美しく、もっさり感もあまりない。しかし、IDEの設定が沢山ある。
  • 停止から再開に30-40秒ほどかかるので少し待つ必要がある
  • Tokyoリージョンで使えない。しかし、シンガポールでも遅延は気にならない。
  • 下記のような良心的な価格設定から始められる。 大規模なRailsアプリなどは1Gじゃ足りないので他のインスタンスを使う必要あり。価格帯は教育用途には合っているように思う。

Scroll to top