Tag: AWS

cheetsheet/aws/medialive

チャンネル操作 効果 コマンド チャンネルのリスト aws medialive list-channels –region ap-southeast-1 | jq -r ‘.Channels[].Id’) 止める aws medialive stop-channel –channel-id チャンネル ID 削除 aws medialive delete-channel –channel-id チャンネル ID 作成 aws medialive create-channel –cli-input-json file://channel_sample.json | jq ‘.Channel.Id’ 開始 aws medialive start-channel –channel-id チャンネル ID インプットを作成する aws medialive create-input –cli-input-json “$CREATEINPUT” –region ap-southeast-1 インプット id を調べる aws medialive list-inputs –region ap-southeast-1 | jq -r ‘. Read more...

簡単な 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...

ECRのパブリックレポジトリをCLIから作成する

2021/09/10 時点だと --region us-east-1 が必要だった。でないと Could not connect to the endpoint URL: "https://api.ecr-public.ap-northeast-1.amazonaws.com/" というエラーがでる。AWS 管理コンソール上は東京リージョンで存在を確認できる。 作成 AWS 管理コンソールでの作り方は パブリックリポジトリの作成 aws ecr-public create-repository --repository-name hogehoge --region us-east-1 削除 aws ecr-public delete-repository --repository-name hogehoge --region us-east-1 push までの流れ push する前にログインする( public とはいえ push にはログインが必要 ビルドする タグづけをする push aws ecr-public get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin public.ecr.aws/hoge docker build -t test-20210910-1 . docker tag test-20210910-1:latest public.ecr.aws/hoge/test-20210910-1:latest docker push public. Read more...

WordPress、kusanagiでのアップデート

アップデート手順 システム構成 AWS 上で CloudFront + ALB + EC2 + RDS の構成で運用中。 SSL アクセラレーターは ALB RDS は毎日スナップショットを取れる運用。 アップデート前には_AMI から検証用 Wordpress を別に構築する。 WordPress はアップデートに失敗すると、真っ白になったりする、と聞いたので 別サーバーを立てて検証してからアップデートを試みた方が良いと思う。 デフォルトの状態だとアップデートできなかった。 別サーバーを立てて検証中、怖い表示になった。本番とは別にサーバーを立てて検証してて助かった。 事前のステージング環境での確認 作業前に対象ドメインの Wordpress で非公開のページを作っておく( これを目印にする ) RDS, EC2 をそれぞれバックアップから作成する EC2 が参照する RDS を新しく作ったものに変更する EC2 をロードバランサー配下に追加する 本番での作業の流れ 後述するが下記のような流れ 作業前に対象ドメインの Wordpress で非公開のページを作っておく( これを目印にする ) RDS, EC2 をそれぞれバックアップから作成する EC2 が参照する RDS を新しく作ったものに変更する EC2 を新しく作ったロードバランサー配下に追加する ローカル PC の/etc/hosts を修正し、対象ドメインを新しいロードバランサーの IP アドレスに変更する 再度、アクセスし[0]で作った目印が「無い事」を確認する アップデートの検証を行う アップデートが正常にできたら EC2 をターゲットグループ内の EC2 インスタンスを新旧を入れ替える [4]で /etc/hosts で追加した箇所をコメントアウト 対象ドメインの動作を確認する RDS のスナップショットから DB 作成 RDS、スナップショットリスト=>[システム]=>[前日のスナップショットのチェックボックスをオン]=>[アクション]=>[スナップショットを復元] 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...

AWS Organizationsで作った環境でVPCを作っていく

作業の流れ AWS OrganizationでOrganization Unit ( OU )作成、AWS Organization 内で AWSアカウントも作成 VPC作成、サブネットを各AZごとに合計3つ作成 VPC内でインターネットゲートウェイ作成, 作成したVPCに紐付け AWS、アカウント作成直後のネットワーク設定 実作業 AWSの具体的なリソースは省略しています。得られた値で読み替えてください。 VPC作成 プロファイルは都度、変更してください –cidr-block は 既存サブネットと被らないように取得してください vpcのタグ名は都度、変更する CLIでの作成はここが非常に参考になります aws ec2 --profile test-site create-vpc --cidr-block "172.37.0.0/16" --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=prod}]" { "Vpc": { "CidrBlock": "172.37.0.0/16", "DhcpOptionsId": "dopt-08f0bf2e614f696d8", "State": "pending", "VpcId": "vpc-04d******" "OwnerId": "*************", "InstanceTenancy": "default", "Ipv6CidrBlockAssociationSet": [], "CidrBlockAssociationSet": [ { "AssociationId": "vpc-cidr-assoc-", "CidrBlock": "172.37.0.0/16", "CidrBlockState": { "State": "associated" } } ], "IsDefault": false, "Tags": [ { "Key": "Name", "Value": "prod" } ] } } また上記のCLIで作成した際の 「 “VpcId”: “vpc-? Read more...

AWS Organizations関連のメモ

AWS Organizations でアカウント管理してみる - ユニファ開発者ブログ 久しぶりに作業した時には、ざっと目を通す AWS Organizations の用語と概念 - AWS Organizations 手順 ログイン https://console.aws.amazon.com/organizations/home?region=ap-northeast-1#/accounts [ アカウントの追加 ]->[ アカウントの作成 ] フルネーム: kaoru-inoue Eメール: kaoru-inoue@hoge.com IAM ロール名: OrganizationAccountAccessRole [ 作成 ]をクリック ログイン https://console.aws.amazon.com/organizations/home#/accounts [ Organize account ]をクリック、組織を作成する 組織を作成する [ Create organizational unit ]( [ 新規組織単位 ] )をクリック。 組織名を入力。ハイフンを利用可能だった。使わなくても良いが。 アカウント( というかOrganization のアカウント )の作成 [ Account ]->[ Add account ]->[ Create account ] Read more...

CloudWatch logsのログをinsightで検索

ログについては、ひとまずCloudWatch logsに投げ込む運用にしています(注1 このCloudWatch logsを高速に検索できるインサイトをCLIから使う紹介です( WEBでの使い方については[ CloudWatch ]->[ インサイト ]でいろいろ試していただきたいです ) 障害調査の場合、どのみちgrepすることになるのでCLIでの手順も残しておきます。 ログ取得 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html --start-time 開始時刻をunixtime --end-time 終了時刻をunixtime --query-string 参考 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html クエリ(フィルタリング)について 検索する際の方法 limit 10 とか。 このためにインサイトを使っていると言えますが正規表現 | filter @message like /access_token=/ クエリ例 参考: サンプルクエリ - Amazon CloudWatch Logs nginxのログのみを表示する | filter @logStream LIKE /nginx/ ロードバランサからのヘルスチェックを除外する | filter @message NOT LIKE /ua:ELB-HealthChecker/ ステータスコードが500番台のもののみを表示する | filter @message LIKE /status:5\d+/ ログをパースして変数にセットする | parse @message "time:*host:*forwardedfor:*req:*status:*size:*referer:*ua:*reqtime:*cache:*runtime:*vhost:*userid:*" as time, host, forwardedfor, req, status, size, referer, ua, reqtime, cache, runtime, vhost, userid クエリ実行( ログ検索は時間がかかるため、後で別途getする必要があります) bash環境(dateコマンドはbrewのcoreutilsを使用) Read more...

CloudWatchでアラートを設定する

CloudWatchのアラートを設定する方法 ここでは各環境向けにCPUとメモリ使用率のアラートを設定する方法を共有します。以下で説明する alarms.sh、 alarm_mem_template.json、 alarm_cpu_template.json の3つのファイルを用いて作業します。 alarms.sh 各ECSサービスのアラームの設定をするShell Scriptです。 alarms.shの名前で以下の内容のファイルを作成します。 このスクリプトでは現在作成されている環境を全て取得し、そのそれぞれに対して、すでに同名のアラームがある場合には更新、 存在しない場合には新規にアラームを作成します。 そのため新しい環境を追加し、CPUおよびメモリ使用率のアラートを設定したい度に実行する必要があります。 #!/bin/bash services=$(aws ecs list-services --cluster=test-dev-20181030-1 | jq -r .serviceArns[] | sed s#.*/##g) THRESHOLD_MEM=70 THRESHOLD_CPU=70 for service in ${services[@]}; do SERVICE=$service THRESHOLD_MEM=$THRESHOLD_MEM envsubst < ./alarm_mem_template.json > alarm_mem.json SERVICE=$service THRESHOLD_CPU=$THRESHOLD_CPU envsubst < ./alarm_cpu_template.json > alarm_cpu.json aws cloudwatch put-metric-alarm --cli-input-json file://alarm_mem.json aws cloudwatch put-metric-alarm --cli-input-json file://alarm_cpu.json done 使い方 alarms.sh を作成したディレクトリに alarm_mem_template.json と alarm_cpu_template.json をそれぞれ以下の内容で作成します。 alarm_mem_template.json { "EvaluationPeriods": 3, "TreatMissingData": "missing", "ComparisonOperator": "GreaterThanThreshold", "ActionsEnabled": true, "AlarmActions": [ "arn:aws:sns:ap-northeast-1:811111111111:alert2Slack" ], "OKActions": [ "arn:aws:sns:ap-northeast-1:811111111111:alert2Slack" ], "Namespace": "AWS/ECS", "Period": 60, "Threshold": ${THRESHOLD_MEM}, "AlarmName": "Memory Utilization of ${SERVICE} alert to Slack", "Dimensions": [ { "Name": "ClusterName", "Value": "test-dev-20181030-1" }, { "Name": "ServiceName", "Value": "${SERVICE}" } ], "DatapointsToAlarm": 3, "Statistic": "Average", "MetricName": "MemoryUtilization" } alarm_cpu_template. Read more...

MediaLiveをCloudWatchで監視する

背景 MediaLive ですが、いろいろなエラーを通知してくれます。 やれ「RTMP 接続が切れたよ」とか「オーディオ入力 or ビデオ入力が無いよ」とかですね。 通常、ライブ配信が始まる前は当然、MediaLive への入力は無いはずなので、通知は構わないのですが、 ライブ配信中に出ると、それはもうトラブルシューティングの情報の一つとして重要なものになります。 ( というか当初、エラーは出てるっぽいし、挙動はおかしいんだけど、どんなエラーが出てるか分からないケースがあって窮地な時がありました ) 今は管理画面の[ channels ]->[ 目的のチャンネル ]->[ Alerts ]から確認できます。が、ログとして残しておくのは良い事だと思います。 このエラー出力のフォーマットは決まっている訳ではなく、たまに変わります。ので 『あー、エラー出力が変わったからアラートが上がらなくなったのね』、という事がログを残しておくと分かります。 手順 WebUI SNS トピック作成 SNS のページ( https://ap-northeast-1.console.aws.amazon.com/sns/ )を開く [ トピック ]->[ 新しいトピックの作成 ]->トピック名の入力、私は[ MediaLiveEvent ]、表示名[ MediaLiveEvent ]と入れてみた 作成したトピックの ARN をコピペ arn:aws:sns:ap-northeast-1:1111111111111:MediaLiveEvent ( 同じ SNS 内の左側メニュー )[ サブスクリプション ]->[ サブスクリプションの作成 ] [ トピック ARN ]に先程作成した MediaLive のトピックの ARN を入力 Read more...