能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

ParseServerを構築した話2020その2

諸事情でParseServerを構築する必要にせまられた際のメモ。ParseServerが結構モダン化しており、モダン化に伴いこちらの知識もアップデートする必要があった。ParseServerの構築は2017年ごろにBitnami が提供するParseServerを使ったのが最後で、一から構築サーバーを一から構築することになった。

作業を列挙すると、

  1. データベースの修復
  2. セキュア接続の確保
  3. Blobデータ格納先の修復
  4. CloudCodeの復元
  5. プッシュ通知の復元
  6. 外部との接続

となる。

今回は、3について。

ParseServer のプラグインリニューアル問題

ParseServerを構築した記録を辿ると2017年だった。

2017年のBitnami ParseServerと2020年のBitnami ParseServerの構成はかなり違っていたが、ParseServer のプラグイン関係の変化があり、そこで問題にぶつかっていた。

問題としては、ParseServerにBlobデータ保存用のプラグインを追加する際に使用する。fileAdapterであった。今回はAWSのEC2上にBitnami Serverを用いている。

AWS Marketplace インスタンスの起動

Bitnami 側でAWS機能を使うためのセットアップが済んでおり、AWS CLI(コンソールベースでAWS機能を操作可能なツール)や、AWS S3をfileAdapter で使用するためのfileAdapterもセットアップされていると至れり尽くせりである。

parse-server-s3-adapter(Bitnami ParseServerではセットアップ済)

ただしデフォルトの、設定ではS3のbucket(データをストアするための仕切りのようなもの)とは接続されていない(bitnami 側ではEC2以外のサービスは面倒を見ることはできない) ので、ParseServerを設定するためのparse のconfig.json にfile adapterの設定を行う必要がある。

この設定が3年で変わっていたため調査が必要となり数日悩んでしまった。

AWSのアクセス権限よくわかっていない問題とその解決

具体的には、parse-server-s3-adapter では、S3アクセス権限を持つユーザーのアクセスIDと秘密コードは非奨励となっており代わりにAWSの権限を設定してねという話になっていた。

AWSの権限を設定してね、と軽く書いているがAWSから3年ほど離れていた身としては、どうすれば権限を渡すことができるのか?でしばらく考え込んでしまう(linuxだから環境変数か?、サーバー起動時に環境変数を渡すスクリプを書けば良いのか?)。

結果としてはEC2で構築する場合は、EC2自体にS3アクセス権限をもったAWSの権限を付与すれば良いというAWS使用者なら当然の話に帰着する。そんなものわからないのかという言われればそうなのだが書くのは一時の恥、書かかねば未来の自分の時間を削ぐ結果になるので書かずにはいられぬ次第。

設定の仕方は動作中のAWSのEC2画面で目的のEC2を選択、アクションボタン(もしくは右クリック)で

インスタンスの設定 - IAMロールの割り当て/置換

を選択。IAMロールは機能(EC2とか)に対して他の機能(S3)のアクセス権限を、どの範囲で付与するかを指定する(Who - Where - How)。別にEC2だけを範囲としていない汎用な機能なので指定には注意が必要。

IAMロールでEC2からS3をアクセス制御 | 技術情報ブログ | マネージドホスティングのディーネット

私は上記を参考としS3アクセス権限を付与している。S3アクセス権限は2017年ごろと変わりなく、Resourceを指定することで他bucketに影響がでない最低限の設定は施しておく。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::parseserverhoge",
                "arn:aws:s3:::parseserverhoge/*"
            ]
        }
     ]
 }

上記アクセス権限を付与した(bucket名parseserverhogeは仮)。

IAMロールをParseServerが動作するEC2に適用するとS3サーバへのアクセスが可能となる。確認にはParseServerが動作するEC2 にターミナルからアクセスしてAWS CLIでS3のバケットにアクセスできるかを確認すれば良い。

$ aws s3 ls s3://parseserverhoge</code>

アクセスできれば、AWS SDK for Javascriptを使用しているparse-server-s3-adapter でもS3にアクセス可能となっている。確かめるにはparse のconfig.jsonにparse-server-s3-adapter の設定を追記し、parse server を再起動を試みてエラーが出なければ成功扱いで良いはず(アクセス権限がないとparse server起動に失敗するため成否判断がしやすい)。