三蔵開発メモ

Web開発やインフラ関連のメモを共有します

Kubernetes ingress-nginxで大容量ファイルアップロード等を許可する方法

Kubernetesでアプリケーションを動かしていて、大容量ファイルのアップロードなどを許可する場合、
pod内のnginxやapachephp.iniなどを変更しても、ingress-nginx経由で通信を行っているため、ingress-nginx内の設定を変更する必要がある。

その場合、ConfigMapを設定したのだが、どうもグローバルに設定が反映されない。
kubernetesingress-nginxのドキュメントをみていくと、Ingressのルールを設定する時のyamlアノテーションに設定すればいいことがわかった。

kubernetes.github.io

以下のように設定した。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 8m #これを追加
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-nginx-tasien-verify
spec:
  rules:
 ー中略ー

Flutterのバージョンをダウングレードする

flutterにはダウングレードコマンドがあるが、
自分の環境ではいまいちうまく動かなかったので以下のように実行した。
※flutterをインストールしたフォルダに移動してから実行。

git checkout 1.17.1
flutter doctor
flutter --version

「1.17.1」の箇所を任意のバージョンにする。

AWS ECSについて運用、構築、勉強したことまとめ

ECSがぱっと見複雑だったため、構築時に学んだことをメモ。

要素について

クラスタ

  • コンテナを入れるための塊。EC2とFARGATEが選べる。

タスク定義

  • コンテナを起動させる設定。コンテナイメージを指定したり、いくつ起動させるかなどを設定する。

サービス

  • クラスターに紐づく。タスクを常駐させるための仕組み。
  • webアプリなどのコンテナを起動するタスクをこれに紐づけて常に起動させるようにできる。
  • ロードバランサー、ターゲットグループ と紐付けを行うのもここ。

シンプルなウェブアプリ構築の流れ

動くコンテナイメージを作成する

  • 試すだけであればdockerhubからnginxの公式dockerimageをもってくるでもOK

ecs-cli コマンドをインストールする

ecs-cliインストール(AWS公式)

  • ecsの操作をコマンドラインで行えるようにする。大体のことはマネジメントコンソールでできるが、ECRにdocker imageをアップロードするときに便利なコマンドがある。
ecs-cli push [ローカルのdockerイメージ名]:[タグ名]

上記コマンドでECRにプッシュできる。

クラスターを作成

  • マネジメントコンソールで行う。
  • ECSを選択し、クラスターを選択。クラスターの作成メニューを選ぶと、FARGATEか、EC2(Linux)、EC2(Windows)が選べるが、ネットワーク設定のみで簡単なのがFARGATEなのでそれを選択する。
  • クラスター名、VPCを作るか、cloudwatchで監視するかくらいの設定で作れる

タスクを作成

  • マネジメントコンソールで行う。
  • ECSを選択し、タスク定義を選択。新しいタスク定義の作成を選択する。
  • FARGATEかEC2を選べと出るので、FARGATEを選択。
  • タスク定義名。好きな名前をつける。
  • タスクロール(ecsTaskExecutionRoleというのがおそらくあるのでそれを選択)
  • タスクメモリ、タスクCPUを規模に合わせて選択。
  • コンテナの追加を選択し、コンテナ名欄は、任意の名前。イメージ欄はECRに上げたイメージ、またはdockerhubにあるイメージを選択する。ECRにあげたイメージは、イメージリポジトリのURLが必要だが、dockerhubにある公式なイメージなどは、イメージ名とタグでOK「nginx:latest」みたいに。ポートマッピングは80番等外に向けるために必要なポートを開ける。他は特にいじる必要はないが、ログ出力が必要な場合は、ストレージとログ項目のログ設定の「Autre-configure CloudWatch Logs」にチェックを入れてログ出力をcloudwatchで受け取れるようにする。
  • 他沢山の設定項目があるが必須ではないのでとりあえず設定しなくても大丈夫。
  • 作成ボタンを押すとタスクができる。

ターゲットグループ を作る

  • マネジメントコンソールで行う
  • EC2を選択し、ターゲットグループ を選択。
  • ターゲットグループ の作成を選択。
  • ターゲットグループ 名は任意
  • ターゲットの種類はIP
  • プロトコルやポートは任意だがHTTPと80が大半のはず。
  • VPCはECSのクラスターと同じものを選ぶ。
  • 作成ボタンを押す
  • 一覧に作成できたターゲットグループ が表示されるので、それをクリック
  • 詳細画面にARNがあるのでそれを控えておく。

ロードバランサーを作る

  • マネジメントコンソールで行う
  • EC2を選択し、ロードバランサーを選択。ロードバランサーの作成を押す。
  • Application Load Balancerを選択。
  • 名前は任意
  • スキームはインターネット向け
  • IPアドレスタイプはipv4
  • リスナーは80なり443なり任意で選ぶ。
  • VPCはECSクラスターと同じもの
  • セキュリティーグループを選ぶ時はリスナーと同じポートが空いているものを選ぶ。
  • ルーティングの設定でターゲットグループ の選択がでるので、上記で選んだターゲットグループ を選ぶ。

サービス作成

  • マネジメントコンソールで行う。
  • ECSを選択し、クラスターを選択。作成したクラスターをクリックし、サービスタブを選択。
  • 作成ボタンを押す。
  • 起動タイプはFARGATE
  • タスク定義は先ほど作ったタスクを選択。
  • クラスターも同様に作ったものを選択。
  • サービス名は任意。
  • サービスタイプは任意で良いがREPLICAで問題ない。
  • デプロイメント、タスクの配置も任意だがデフォルトで良い。
  • 次のステップでネットワーク構成を選ぶので、クラスタVPC、サブネットはロードバランサーと同じものをを選ぶ。セキュリティグループは任意。おそらく80番ポートがあいているものでOK
  • パブリックIPの割り当てはENABLED
  • ロードバランシング項目では、ALBを選択
  • 先ほど作ったロードバランサー、ターゲットグループのARN、コンテナ名などを入力、選択。
  • 次のステップでオートスケール設定ができるので、任意で行う。
  • 最後に確認して作成。

疏通確認

  • ロードバランサーのCNAMEにアクセスしたらコンテナにアクセスできる。(nginxだったらnginxのwelcome画面が出るはず)

その他

タスク(コンテナ)が起動しない

  • マネジメントコンソールで、クラスターを選択、タスクタブのStoppedになっているタスクを選択する。
  • 詳細が表示されるので、さらにエラーが起きているコンテナを選択し、エラーの詳細を調べる。
    ※よくあるのがcloudwatchログを作ろうとして権限がないエラーがある。その場合は、作ろうとしているcloudwatchログのグループを事前に作っておくと良い。

ログの確認

  • cloudwatchログを設定しておけば、マネジメントコンソールのcloudwatchページで、設定したロググループを選択すればコンテナごとのログが見られる。
  • Laravel等webフレームワークなどを利用している場合は、のデフォルトのログ出力設定を標準出力にしておくと良い。

CORSにちゃんと対応しているかチェックするcurlコマンド

CORSに対応したときにちゃんとレスポンスを返せるか以下のコマンドでチェックできる。
この場合、
http://sample.jpは、APIを実行したいURL。
https://your-domain.com/your/apiは、CORS対応をしたAPI等のURL。

curl -X GET -I -H "Origin: http://sample.jp" https://your-domain.com/your/api

大丈夫であれば200が返ってきて、ダメだったら403が返ってくる。

参考:LaravelでCORSに対応する - KayaMemo

AWSのECSについて備忘録

AWSのECSというサービスは、シンプルと言われながらも独自の要素が多くつまづいたので概要をメモしておく。

クラスタ

  • EC2(VMインスタンス)、FARGATE(抽象化されている)どちらかを選んで作成できる。コンテナ置き場。

タスク

  • コンテナイメージをどのようにリソースを使って、どのように起動させて動かすかといった内容を保存しておくもの
  • クラスターに紐づくこともできるが単一で設定することもできる。

サービス

ecs-cliについて

  • ecs-cli up でクラスターを作成
  • ecs-cli compose up でタスク登録
  • ecs-cli compose service up でサービス登録

ecs-cli composeはdocker-compose.ymlファイルを参照できる。さらに、ecs専用のecs-param設定をyamlファイルに書いて読みこますことができる。

webサービスにおけるシンプルな作成の流れ。

マネジメントコンソールでやる想定。

  • dockerイメージをローカルで作成し、ECRに登録。 (ecs-cli push イメージ名 でいける)

  • タスクを作成 (ここでECRにあげたコンテナを設定する)

  • クラスターを作成 (EC2でやるかFARGATEでやるか設定。FARGATEの方が必須設定のものが少なくて楽かも)

  • 必要ならALBとターゲットグループ (ターゲットはFARGATEならIP)を作成し、ターゲットグループ をALBにひもづけておく

  • サービスを作成 (コンテナ、ポート、ターゲットグループを紐づける )

  • ロードバランサーまたはIPからアクセス。

dockerでlaravelを動かしたらルーティングが正しく動かなかったのを解決したメモ

php7.3-apacheという公式イメージを利用して、dockerでlaravelを動かしたら「/」直下は表示されるのにルーティングはうまくいかなかった。

  • .htaccessの記述は問題なし
  • php artisan route:list で確認してもちゃんとルーティングはでている

いろいろ調べたところ、mod_rewriteが動いていないのが原因だった。

Dockerfileに

RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

上記を追加して再ビルドしたら無事動くようになった。

FlutterでiOS実機ビルドでエラーがでてしまったのを直した

FlutterでiPhoneに実機ビルドしようとしたとき、 アプリはインストールされるのだが、エラーになってしまいsyncできない状態になってしまった。

Unable to locate DeviceSupport directory with suffix 'Symbols'. This probably means you don't have Xcode installed, you will need to launch the app manually and logging output will not be shown!
Could not install build/ios/iphoneos/Runner.app on (deviceId).
Try launching Xcode and selecting "Product > Run" to fix the problem:
  open ios/Runner.xcworkspace

Error launching application on iPhone8.

こちらの記事を参考にFLUTTER_ROOTをセットしてみたが、 自分の場合それだけでは改善しなかった。

以下を.bash_profileに追加

export FLUTTER_ROOT=[flutterSDKの場所]

qiita.com

さらに以下の記事を参考に、flutter clean等を実行したら無事ビルドできるようになった。

cd [プロジェクトのルート]/ios
pod setup
cd [プロジェクトのルート]
flutter clean

qiita.com