Category: AWS

簡単な EC2 インスタンスのバックアップ機構を作る

日次で自動的に cron で再起動して、AMI イメージを取得したい。 再起動が必要だが再起動時はメンテナンス画面を出しておきたい( 深夜メンテナンス時間が取れるサービスに限る ) ALB でメンテナンス画面を出せる機能を用いてサーバ終了、起動時にメンテナンス画面に切り替える 仕組み EC2 上で自分自身のイメージを取得するスクリプトを用意する EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する EC2 サーバの crontab にスクリプトを用意する 起動終了時に ALB のルールのプライオリティを変更する処理を組み込む EC2 上で自分自身のイメージを取得するスクリプトを用意する /usr/local/bin/ami_backup.bash に下記のスクリプトを設置した。 #!/bin/bash id=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id) /usr/bin/aws ec2 create-image --region ap-northeast-1 --instance-id $id --name "wordpress-www-update-$id-$(date +%Y%m%d%H%M)" --reboot wordpress-www-update の部分はシステムによって変えた方が良いと思う。 あるいは$id にインスタンス名が入るので、それを持ってユニークとするか( ただし検索が面倒 ) EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する 下記のロールを持つように IAM を作成、EC2 サーバーに付与 elasticloadbalancing はロードバランサーのルールのプライオリティの上下に使う ec2 は AMI の作成に使う { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "elasticloadbalancing:DescribeRules", "elasticloadbalancing:SetRulePriorities" "ec2:ExportImage", "ec2:DescribeImages", "ec2:DeleteTags", "ec2:EnableImageDeprecation", "ec2:CreateTags", "ec2:RegisterImage", "ec2:CreateImage", "ec2:ModifyImageAttribute", "ec2:CreateStoreImageTask", "ec2:DisableImageDeprecation" ], "Resource": "*" } ] } EC2 サーバの crontab にスクリプトを用意する AM 03:01 に実施 Read more...

EC2上でWindowsを起動してリモートログイン

職場の開発は macOS で行われるが、Windows のお客様から Windows 環境で表示が崩れる問い合わせがあり、 リモートワークが始まる前は職場の Windows 機で確認していたが、そのためだけに出社するのは無駄なので EC2 上で検証する事にした。 標準だと英語版の AMI が選択されるが、コミュニティ AMI を検索すると Amazon から提供された日本語版が存在する。 環境 日本語版 Windows 2019 standard 手順 EC2 の画面から[インスタンスを起動]をクリック hogege [コミュニティ AMI]を選択した上で、検索キーワードに[Japanese]を入れ検索。 オペレーティングシステムは Windows に絞る。SQL サーバーも含まれるので、それ以外の通常の Windows を選択する。 メモリは 8GB 程度あった方が良いか、という事で t2.large を選択。 各ネットワークに合わせて設定して RDP 用のセキュリティグループを作成する。 インスタンスを起動後、インスタンスを選択し、画面右上の「アクション」から「接続」を選択。 途中、AWS EC2 の秘密鍵が求められるので、ブラウザ上から選択、パスワードが得られる。 RDP で接続するためのファイルがダウンロードできるため、ダウンロードして実行。 Windows にログインする。 Edge インストール Windows Server 2019 への Chromium Edge がわかりにくい!(インストール手順解説を参考に Edge をインストール。 ポイントとしては IE の「信頼済みサイト」に「https://.officeapps.live.com/」と「https://.microsoft.com/」を追加する所だと思う。 Read more...

aws/s3

背景 特定の画像ファイルをs3のバケット間でコピーしたい。下記のような画像ファイルのリストは得られているものとする。 20190224015128auhP0mxtSX.png 20190224190754KuNToorMQc.png 20190224190809ryOuqd6bTC.png 20190226065547aZVU6WQLQw.png 20190226065559jnla1SwUik.png この際、 GNU parallel と aws-cli を使って手軽にコピーした。 GNU parallelインストール sudo yum -y install parallel cat 画像ファイル名 | parallel -a - --jobs 60 aws s3 cp s3://test-bucket/chat/image/{} s3://test-depot/chat/ $(date +%Y%m%d%H%M).log 2>&1 Read more...

MediaLiveでRTMP接続があった事を検知する

ひょっとするとServerlessFrameworkでも検索条件が作れるかもしれないが手動で作成した MediaLiveでRTMPで接続ができた際にトリガーとする方法 { "source": [ "aws.medialive" ], "detail": { "alarm_state": [ "cleared" ], "message": [ "Waiting for RTMP input" ] } } ターゲットはStepFunctionを指定した。 ServerlessFrameworkで、直接、CloudWatch ルールからStepfunctionを指定することはできなかった。 通常のlambdaであれば、ServerlessFrameworkで指定可能だろう、若干面倒そうではあるかな。手動で設定しよう。 Read more...

MediaLiveでライブ配信システムを構築する

ライブ配信システムの構成 映像データは下記のように流れる。 カメラ、マイク -> ローランドの映像ミキサー -> LiveShell X -> MediaLive -> MediaStore -> CloudFront -> 各プラットフォームのプレーヤー この手順では、MediaLive、MediaStore、CloudFrontの設定について行う。 このうち、MediaLiveには インプット( LiveShell X からの RTMP を受け取る ) チャンネル( 映像データをエンコードする ) で構成されている。 またMediaStoreはストレージで、MediaLiveでエンコードされたデータを保存する領域になっている( MediaLive だけでは映像を保存できない、かならず別の保存する領域に転送する必要がある ) CloudFrontは大規模配信で使われるCDNで、 複数ユーザにキャッシュを見せる事で、MediaStoreの負荷を下げるために用いている。つまりCloudFront無しでも配信は可能だが、CloudFront無しだとライブ授業のユーザー数には耐えられないため、導入しておいた方がよい。 MediaStore( 映像チャンク置き場 )を作る MediaStoreは「MediaLiveでエンコードされた映像のチャンクを置く場所」として必要( MediaLiveにはストレージが無いので、別途つくる必要がある ) MediaLiveを作る際にMediaStoreのアドレスを指定する必要があるので、事前に作成する。 チャンネルを作成する MediaLiveで映像データをエンコードするチャンネルを作成する 管理画面 からログイン 設定例 入力名: dev 入力タイプ: RTMP (プッシュ) Network mode: Public 入力セキュリティグループ: 既存の使用、0.0.0.0/0 入力の送信先: SINGLE_PIPELINE [チャンネルの作成] をクリック ( その環境にMediaLive用のロールが無ければ作る必要があるので )テンプレートからロールを作成する チャンネルテンプレートは[ Live Action ]をベースに作成する事にした。 ( このテンプレートの内容は時代によって変わるようだ。以前よりテンプレートも増えているし内容も異なる ) Read more...

MediaLiveで配信中のファイルを結合する

ライブ動画のTS結合方法 高解像度側 現在のチャンク数を確認 $ curl https://live3.test.com/a/live_1080p30.m3u8 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:1230 現在、1230までチャンク数が進んでいる。 最初から現在までのチャンクをダウンロード ( ユーザから見えるのはCloudFrontであるため、MediaStore経由ではなく、CloudFront経由で取得している。 特にライブ中はMediaStoreの制限にかかるケースがありえるので、直接の取得は避ける ) wgetコマンドでTSファイルを取得 作業ディレクトリ作成 mkdir -p ~/tmp/$(date +%Y%m%d) cd ~/tmp/$(date +%Y%m%d) ファイル取得 for num in $(seq -w 1 1230) ; do echo $num ; wget https://live3.test.com/a/live_1080p30_0${num}.ts ; done ダウンロードしたファイルリスト作成 for num in $(seq -w 1 1230) ; do echo "file ./live_1080p30_0${num}.ts" >> file_list.txt ; done 結合 ffmpeg -f concat -safe 0 -i file_list.txt -c copy $(date +%Y%m%d). Read more...

MediaService関連で知ったこまごまとした事

RTMPの接続が切れた場合どうするか チャンネルのグローバル設定にありそう グローバル構成 - 入力損失の動作 グローバル構成設定。 Input Loss Behaviorフィールドは、AWS Elemental MediaLiveが入力ロスを処理する方法を変更します。 AWS Elemental MediaLiveは、入力が予定時刻内に到着していないことを検出すると、前のフレームを設定可能なミリ秒数(ゼロから永遠に)繰り返します。 その時間が経過すると、設定可能なミリ秒数(ゼロから永遠)の黒いフレームが表示されます。 その時間が経過すると、指定されたスレートまたは指定された色に切り替わります。 入力が再開されると、通常の取り込みが続行されます。 この動作を変更することができます。入力損失動作で、入力損失動作を選択します。 表示されるフィールドにはデフォルト値が表示されます。 必要に応じてフィールドを変更します。 後でデフォルトの動作に戻したい場合は、Input Loss BehaviorをDisabledに設定するだけです。 TSファイルを確認する ffmpeg内のツールの ffprobeを使う -show_frames フレームごとの情報を取得する( かなり出力されるのでlessで見る ) キーフレームを30秒ごとに入れると、videoとaudioで30フレーム分の情報を見ることになるのでかなり出力される。 ffprobe -show_frames hoge.ts | less フォーマットを確認する ❯ ffprobe -show_format hoge.ts ffprobe version 3.3.2 Copyright (c) 2007-2017 the FFmpeg developers built with Apple LLVM version 8.1.0 (clang-802.0.42) configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda libavutil 55. Read more...

MediaStoreのフォルダ構成をシンプルにできないかと検討したが却下した

1. Record architecture decisions Date: 2020-06-05 Status 検討 -> 却下。 Decision に理由を書いた。 Context MediaStoreのフォルダ構成をシンプルなものにしたい。 以前、Adobeのライブツールから MediaLiveに切り替えた直後は、 一つの MediaSotre に全てのスタジオの映像データを入れる という構成だった。 つまり、 A, L -> MediaLive -> -> MediaStore -> CloudFront -> ユーザ B, C -> MediaLive -> という構成だった。 この方が、CloudFrontのオリジン設定は 一つの MediaStore を参照するだけで済むため、シンプルな設定ですむ。 ひとつのMediaStoreに集約するため、MediStore上のフォルダ構成は /a/live.m3u8 /a/live_1080p30.m3u8 /a/live-lq.m3u8 /a/live-lq_00001.ts /a/live-lq_??????.ts /b/live.m3u8 /b/live_1080p30.m3u8 /b/live-lq.m3u8 /b/live-lq_00001.ts /b/live-lq_??????.ts これが各スタジオごとにフォルダを作っていた。 ただ、まれに MediaStoreのパフォーマンスがでないケースが起きたため、各スタジオごとにMediaStoreを用意する という形に変更した。 ( どうもMediaStoreの性能の限界に達したようだ。これは将来的に改善するとは思う) この変更後、MediaStoreは各スタジオごとに用意した、 MediaStore上のフォルダ構成もそのまま /a/live.m3u8 /a/live_1080p30.m3u8 /a/live-lq.m3u8 /a/live-lq_00001.ts /a/live-lq_??????.ts というフォルダ構造を引き継いだが、この /a/ というフォルダは MediaLive 側の出力設定を変更する事で無くせる事が分かったので、 消してシンプルにしたい。 Read more...

passenger

Canvas LMS の起動に時間がかかりすぎて Passenger が落ちる Canvas LMS というラーニングマネージメントシステムの運用中、Passenger が再起動を繰り返す症状になった。 何度か再起動を繰り返すと、たまに立ち上がる。 Canvas LMS は重量級のアプリケーションなので起動に時間がかかっている事が原因と仮定して 急場を凌ぐためサーバーの性能を上げると症状は解消した。 ただできれば安く運用したいため原因を調べ Passenger 側のタイムアウト値を伸ばすことで解消した。 環境 Ubuntu 18.04 Canvas LMS バージョン 2021/04/14 21:24:27 リリースのもの 原因 Apache の下記のようなログが出ていた。 [ E 2021-08-19 12:51:59.9818 2620/Tf age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /var/canvas: A timeout occurred while starting a preloader process. Error ID: 5601fca6 Error details saved to: /tmp/passenger-error-rBz6ES.html Passenger は問題が起きた時 /tmp 配下にログを吐き出す。 /var/log/syslog ではなく絶えず吐き出すわけではないので問題を難しくしているようにも思うが。 # find / -name 'passenger-error*html' /tmp/systemd-private-0af79b8b175f43b4a340f69608070e76-apache2. Read more...

MediaLiveでテンプレートから作製する

AWSメディアサービスで 動画配信のパラメータを変更して検証するの… 超面倒。 そもそも、都度チャンネル作らなきゃならない設定はなんなの。辛み。 CLIから作りたくなってきた。aws-cliをアップデートするとメディアサービスも使えるようになります! 最初に aws-cliをアップデートする pip install -U awscli チャンネルidを取得する 先にチャンネルのIDを確認します。WebUIだと [ MediaLive ]->[ Channels ]->作成したチャンネルのラジオボタンをクリック->[ ID ]の所の数字をメモ aws medialive describe-channel --region ap-southeast-1 --channel-id チャンネルid > channel_sample.json CLIからだと aws medialive list-channels --region ap-southeast-1 で取得できます チャンネル設定を変更する 上記の describe-channel はユニークであるべきidやチャンネルごとに振られるIPアドレス、ステータスなども出力されてしまいますので削除します。 PipelinesRunningCount EgressEndpoints State Id Arn 既にある設定を削除する 注) 下記を実行すると、既にあるチャンネル設定が一つ消えます。高速に検証するため、チャンネル設定を消して作ってを行っていますが、サービスするようになったら変更する必要があるでしょう。 上記のチャンネルidを取得する方法を利用して、既存のチャンネル設定を削除しています。 aws medialive delete-channel --region ap-southeast-1 --channel-id $(aws medialive list-channels --region ap-southeast-1 | jq -r '.Channels[].Id') jsonからチャンネルを作る aws medialive create-channel --region ap-southeast-1 --cli-input-json file://channel_sample. Read more...