EC2からS3へ大容量ファイルのコピー

<駄目な例(メモリー食いまくり)>

Storage::disk('s3')->put($move_to, Storage::file_get_contents($file));

 

<いい例(メモリを食わない)>

Storage::disk('s3')->put($move_to, fopen($file, 'r+'));

 

 

https://blog.larapulse.com/laravel/handling-large-files-on-s3

 

以上

 

 

 

Laravel + Dropzonejs + pionl/laravel-chunk-upload で大容量ファイルのアップロード

https://github.com/pionl/laravel-chunk-upload

https://github.com/pionl/laravel-chunk-upload/wiki

 

===== インストール編  ======

1. SSHでサーバーにログインし以下のコマンドを打つ

composer require pion/laravel-chunk-upload

2.  Config/app.phpを開き、Providers[]の中に以下を追加

\Pion\Laravel\ChunkUpload\Providers\ChunkUploadServiceProvider::class

 3.  再びコマンドで以下を打つ

php artisan vendor:publish --provider="Pion\Laravel\ChunkUpload\Providers\ChunkUploadServiceProvider"

/configの下に、chunk-upload.phpが作成される。

 

===== プログラム編  ======

4. web.phpに以下を追加

Route::post('/upload', 'UploadController@upload');

 

5. UploadControllerを作成

php artisan make:controller UploadController.php

以下のURLからコピーし、作成したUploadController.phpに貼り付ける

https://github.com/pionl/laravel-chunk-upload-example/blob/master/app/Http/Controllers/UploadController.php

 

6.  Dropzone.jsの通常のコードに以下を追加

 Dropzone.options.bookImportDropzone = {
   maxFilesize: 1000, //1GB
   chunking: true, //chunkアップロードに変更
   method: "POST",
   chunkSize: 2000000, //2MB
   parallelChunkUploads: false, ←★trueにしないと駄目

           retryChunks: true,
           retryChunksLimit: 3,
           chunksUploaded: function (file, done) {

                var response = JSON.parse(file.xhr.response);←★Upload.phpからのレスポンスはこの形で受ける(公式ドキュメント書いといてくれよ)


                //console.log('response='+JSON.stringify(response));

                //chunksuploadedの最後に必ず必要
                done();
           },
   init: function() {

     途中略

           },

           this.on("success", function(file, data){

               //ここは、chunksUploadedのdone()が実行された後に呼ばれる

               //アップロード完了後の処理を書く

            }

}

 ※parallelChunkUploads: true にすると、分割されたファイルが全部揃う前にファイルが結合されてしまうバグが、pionl/laravel-chunk-uploadにあるのでtrueは駄目

 

以上で完了。

Dropzoneにより、大容量のファイルがChunkSizeで分割されてアップロードされる。

全ての分割がアップロードされると、pionl/laravel-chunk-uploadで1つにまとめられ、デフォルトでは、storage/app/uploadの下に保存される。

そして、Dropzoneにレスポンスが返り、success()が実行される。

 

以上

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(CloudWatchエージェント利用) CloudWatchで、EC2のメモリ使用量とディスク容量をウォッチする

基本的には以下に書かれている。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

 

コマンドラインを使用して CloudWatch エージェントをダウンロードおよび設定する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

 

wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

 

sudo rpm -U ./amazon-cloudwatch-agent.rpm 

 

※上記コマンドを実行すると、

create group cwagent, result: 0
create user cwagent, result: 0

となるが、これで正常らしい。

 

CloudWatch エージェントで使用する IAM ロールおよびユーザーを作成する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent-commandline.html

1.「IAM コンソール」ー「ロール」ー「ロールの作成」ー「EC2」

[CloudWatchAgentServerPolicyにチェック→次へ

→ロール名:CloudWatchAgentServerRole で作成

 

2. IAM ユーザーを作成

IAMコンソールー[ユーザー]ー[ユーザーの追加]

ー「プログラムによるアクセス」ー「既存のポリシーを直接アタッチする」

→「CloudWatchAgentServerPolicy」にチェック

→次へ、次へでユーザーを作成し、アクセスキーとシークレットキーをメモる。

 

CloudWatch エージェントの AmazonCloudWatchAgent プロファイルを作成

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

1.次のコマンドを実行

sudo aws configure --profile AmazonCloudWatchAgent

2.アクセスキーとシークレットキーを聞かれるので、上記でメモしたものを入力

3.Default region Nmae: ap-northeast-1

4.Default output format:text

 

(EC2 インスタンスへのインストール) IAM ロールのアタッチ

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

 

EC2 マネジメントコンソール画面で対象の EC2 インスタンスを選び、作成したロールを割り当ててください。 下記の操作にて、 IAM ロールの割り当て/置換ができます。

アクション>インスタンスの設定> IAM ロールの割り当て/置換

→「CloudWatchAgentServerRole」を選択

 

 

CloudWatch エージェント設定ファイルを作成する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file.html

 

1.以下でウィザード実行

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

 

(難しそうな質問抜粋)

which user are you planning to run the agent?

→cwagent

Do you want to turn on StatsD daemon?

→no

Do you want to monitor metrics from CollectD?

->no

Do you want to monitor any host metrics? e.g CPU, memory, ect.

->yes

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.

->no

Do you want to add ec2 dimensions (ImageID, InstanceID, InstaceType AutoScalingGroupName) into all of your metrics is the info is available?

->yes

Whoud you like to collect your metrics at high resolution (途中略)

->60s

Which default metrics config do you want?

->Standard

Are you satisfied with the above config? (途中略)

->yes

Do you have any existing CloudWatch Log Agent () configuration file to import for migration?

->no

Do you want to monitor any log files?

->no

Do you want to store the config in the SSM parameter store?

->no

 

 

2.ウィザードが終わると以下に定義ファイルが作成される

/opt/aws/amazon-cloudwatch-agent/bin/

 

コマンドラインを使用して CloudWatch エージェントを起動する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

 

1.起動

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

 

以下はここのサイトがよくまとまっている

seq-blog.com

 

 

以上

CloudWatchで、EC2のメモリ使用量とディスク容量をウォッチする

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

基本的には上に書いてあるが一部補足

 

1.以下のコマンドを実行

sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64

 2.インストールする場所を作成&移動

mkdir ~/cron-script
cd ~/cron-script

 

3.ダウンロード

curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O

4.スクリプトインストール

unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon

5.AWSの管理画面から「IAM」→「ポリシー」→「ポリシー作成」へと進む

「サービス」ーCloudWatch

「アクション」ーPutMetricData、GetMetricStatistics、ListMetrics を探してチェック

 

「さらにアクセス許可を追加」をクリックし、

「サービス」ーEC2

「アクション」ーDescribeTags にチェック

→ポリシーの確認、作成

 

6.IAMに戻り、「ユーザー」ー「ユーザーを追加」

ユーザー名:Cloudwatch

アクセスの種類:プログラムによるアクセス

 

次画面で「既存のポリシーを直接アタッチ」をクリックし、5で作成したポリシーを割り当てる。

ユーザー作成後、アクセスキーとシークレットキーが表示されるので、メモっておく

 

7.コンソールに戻り、以下を実行

cp awscreds.template awscreds.conf 

 

 8.vi で編集

vi awscreds.conf

AWSAccesseyIdとAWSSecretKeyを入力し、

:wq!

 

9.メモリー関係とディスクスペースを調べる

./mon-put-instance-data.pl --disk-space-util --disk-path=/  --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail --verify --verbose

 

10.cronに登録

crontab -e

 iを押して、insertモードに入り、以下を追加。

*/5 * * * * ~/cron-script/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron

:wq!で終了。

 

 11.以上で設定は完了。

AWSのCloudWatch上で[メトリクス]->[すべてのメトリクス]->[Linuxシステム]->[Filesystem, InstanceId, MountPath]を開くと、各種値がグラフ化される。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CloudFront 覚え書き

1.AWSのCloudFrontの設定で

Alternate Domain Names(CNAMEs)

の項目があるので、CloudFrontで使いたい名前を入れる。

 

2.ACM証明書で、上記の名前を登録する。

注意!この際、リージョンを「米国バージニア北部」にしておかないと、

CloudFrontのACM選択時に選択できない。

既に別のリージョンで証明書を作成済みの場合は、「米国バージニア北部」でも同じ証明書を作成する。

 

3.Roud53で、上記ドメインを登録する。

この際、CNAMEではなく、Aレコードに登録する。

Aレコードで「エイリアス」を選ぶと、「CloudFront」の選択肢が見えるので、それを選択する。

503エラーになった時の忘備録

httpdが止まっているか?

service httpd status

 

止まっている場合、エラーログを見る

sudo less /etc/httpd/logs/error_log

 

S3のマウントを一旦解除し、再マウントする

 

httpd 再開

sudo service httpd restart

 

これでも起動しない場合、AWSにログインして、EC2を再起動

S3を使ったリダイレクト

AドメインからBドメインへ変更した際、Aドメインにあったアクセスを

全てBドメインに振り分ける覚え書き

 

 <リダイレクトの流れ>

ドメインでアクセス→CloudFrontでS3に振り分け→S3で新ドメインにリダイレクト

 

--S3の設定--

(1)S3で、リダイレクト元のドメインと同じ名前のパケットを作成する

例)hogehoge.com

 

(2)作成したパケットのプロパティーを開き、

「リクエストをリダイレクトする」にチェック。

「ターゲットバケットまたはドメイン」にリダイレクト先のドメインを記載

 

--Rout53の設定--

(3)ホストゾーン作成で、リダイレクト元のドメインを作成

(4)リダイレクト元のドメインの設定で、NSレコードを設定

ムームードメインの場合、「取得したドメインで使用する」に4つのNSレコ―ドを記入

 

ーCertificate Managerの設定ー

(5)まず、リージョンで「バージニア北部」を選択。これをしないと、後の証明書の選択で自動で表示されないので注意

 

(6)証明書の作成で、リダイレクト元のドメインを設定

その際、ドメインの検証は、「Route53でのレコード作成」ボタンを押すと自動で行われる

 

ーCloudFrontの設定ー

(7)「Create distribution」を押す。「Web」→「Get started」と進む

Origin Domain Name:(1)で作成したS3のバケットを選択し、「プロパティ」→「Static website hosting」を押し、そこに表示されたエンドポイントを記載

※自動でプルダウンに表示されないので注意

Query String Forwarding and Caching: Forward all, cache based on all

Alternate Domain Names(CNAMEs) :リダイレクト元ドメイン

SSL Certificate: Custom SSL Certificate (example.com)

ここで(6)で作成した証明書をプルダウンから選択

 

ーRoute53ー

(9)再び、Route53に戻り、Aレコードの追加

エイリアス」:はい

エイリアス先」:CloudFront ディストリビューションで(7)で作成したものを選択

 

以上

 

(参考サイト)

https://qiita.com/takahiko/items/342f0726fe88987db93c

 

 

LaravelにFPDI PDF-Parser(有料版)を導入

FPIDは、PDF Ver1.4までしか扱えない。

Ver1.5以上を扱う場合、有料のPDF Parserが必要になる。

購入からインストールまでの忘備録。

 

購入後、SetasignのPickup Depotの「Composer」を見ると以下が書いてある。

{
  "require": {
   "setasign/fpdi_pdf-parser": "2.0.4"
  },
  "repositories": [
  {
   "type": "composer",
   "url": "https://www.setasign.com/downloads/"
  }
  ]
}

この通りする。

まずは、Laravelのcomposer.jsonに以下を追加

"require": {
 "setasign/fpdi_pdf-parser": "2.0.4"
},

composer.jsonに「repositories」の項目がなかったため戸惑ったが、そのままcomposer.jsonに記載すればいいらしい。

"repositories": [
 {
  "type": "composer",
  "url": "https://www.setasign.com/downloads/"
 }
]

 次に、コマンドで

composer update

 

すると、Setasignの

Usernameとパスワードを聞いてくるので入力。

「記憶するか?」と聞かれたので、「Yes」

 

以上で導入完了。

後は、使いたいコントローラーで、

$pdf = new \setasign\Fpdi\Fpdi();

とすると、これまで扱えなかったPDF Ver1.4以上が扱えるようになっている。

 

以上

 

AWSのEC2に一時的にSwap領域を作成する

Lravelでcomposer updateをやると、エラーになった

 

よって、一時的にSwap領域を作成する

 

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/

https://qiita.com/ekzemplaro/items/7a855971ab5463580ef3

 

実際にやったコマンド

sudo /bin/dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo chmod 600 /var/swap
sudo /sbin/mkswap /var/swap
sudo /sbin/swapon /var/swap

free -m で確認

 

<削除>

# スワップ領域を無効化
sudo swapoff  /var/swap

# スワップファイルを削除
sudo rm -f /var/swap

Server responded with 504 code の対策

Dropzone.jsで700MBのファイルをアップロードすると、

Server responded with 504 code.

のレスポンスが返ってきた。

 

Dropzone.jsのタイムアウトは、

timeout:300000,

に設定している。

 

https://qiita.com/kotarella1110/items/169ddcef03983f5d64b2

を見ると、AWSロードバランサーの設定が怪しい。

AWSにログインし、EC2のロードバランサーの設定を確認すると、

アイドルタイムアウト:60

になっていた。

そこを300秒にすることで、無事解決した。

 

以上