- 投稿日:2020-05-14T23:44:09+09:00
AWS EC2のメール送信申請で"A statement indicating~"と返信が来たときに返した返事
Ec2のメール送信申請
沢山の方々が情報を書かれていますが、EC2インスタンスから外部へメール送信するには、AWSへ送信の申請が必要になります。
今回、独自ドメインのメールサーバ(私用)を使うにあたり、申請した際のやり取り(抜粋)を書いておきます。
少々返答に悩み、あまりどこにもよいアドバイスが見つからなかったので、どなたかの参考になれば幸いです。
EC2メール送信申請
クラスメソッドさんの記事も参考になります。
https://dev.classmethod.jp/articles/ec2-send-email-best-practice/
https://dev.classmethod.jp/articles/ec2-port-25-throttle/コピペ文言を用意して頂いているところもありました。
https://sys-guard.com/post-16085/EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-port-25-throttle/こちらが申請サイトです。
https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-requestユースケースの説明
問題は・・・
[ユースケースの説明] フィールドに、ユースケースの説明を入力します。ここでした。
最初に記載した内容(英文がお粗末なのはご容赦ください・・・)
I'd like to use my own domain mail server for personal use.
Please removal of E-mail sending limit and create reverse DNS record.AWSからの返信
Thank you for submitting your request to have the email sending limit removed from your account and/or for an rDNS update.
We will require the following before this request can be processed.
* A clear/detailed use-case for sending mail from EC2
* A statement indicating how you intend to ensure this account is not implicated in sending unwanted mailPlease reply directly to this message with the above information. Once this has been received, we can process your original request.
A clear/detailed use-case for sending mail from EC2
こっちは詳細な用途を教えて欲しいということなので、まあ分かる。A statement indicating how you intend to ensure this account is not implicated in sending unwanted mail
こちらは 何を返信すべきか悩んだ。2問目の調査
文章をそのまま検索すると同様に悩んでForumで聞いている人、SNSで呟いている人が見受けられた。。。
https://www.ratburger.org/members/johnwalker/activity/6659/
こちらのサイトの方は、You ask, "how you intend to ensure this account is not implicated in sending of unwanted mail. (Please provide preventative measures)"? There are no measures required.
と少々ご立腹感が伝わってくる。
(この方は詳細にテクニカルな設定内容を回答されていました。)AWSへの返信
usecaseには、
I am going to make my own server for private use.
Now that domain is hosted by other ISP service. I'll migrate it to aws EC2.
The mail server is used by only private and use for usual e-mail.と回答しておきました。
2問目は悩みましたが、宣言することが求められているのか・・・?と思い、As describe above, the mail server is private use and my account not send unwanted mail to others.
という文章に留めました。
AWSからの返信(2)
2問目の回答に満足頂けなかったようで、
We will require the following before this request can be processed.
* A more i depth statement indicating how you intend to ensure this account is not implicated in sending unwanted mail. Kindly share more details regarding anti-spam configuration/methods used.と返信を頂きました。アンチスパムの具体的な実装方法をどうしているか教えて欲しいということですね。
AWSへの返信(2)
こんな感じで返信しました。
Please kindly confirm below.
- Send mail from only localhost and my ISP network.(limit network segment)
- Build MTA and take necessary measures such as SMTP-AUTH / SPF / DKIM
- rDNS will be setup
- configure postfix and use anti-spam software(rspamd)
The configuration of my postfix is below.
(postfixのmain.cfのspam対策設定を抜粋)しばらくして以下の通りに解除されました!!
We have configured the reverse DNS record(s) you requested! Your request was mapped for the following:
...(IPアドレス) <--> *..(FQDN)
Please note that propagation of this update to DNSBL services that Amazon works with may take up to a week.
Email sending limitations have also been removed for any resources for the region your EIP is located in.
このような内容を伝える必要がある事があらかじめ分かっていれば、スムーズにやり取りできるのですが・・・。
色々調べた限りでは、半年ぐらい前に書かれた記事ではすんなり申請が通っているようなので、ここ最近は確認が厳しくなったのか、私がたまたま深く突っ込まれたのか、どちらかかと思っています。(真相は謎ですが)
- 投稿日:2020-05-14T23:10:20+09:00
AWS Config カスタムルールを使用してRDSを監視する
概要
AWS Config カスタムルールを使用してRDSを監視したい
更に言えば特定のインスタンスタイプ以外は違反としたい前提
AWS Config有効化
こちらを参考にしました。
CloudFormationによるAWS Configの有効化 - Qiita
本題
lambda関数
blueprintのconfig-rule-change-triggeredをベースに判定部分を修正します。
function evaluateChangeNotificationCompliance( configurationItem: { configuration: { dBInstanceClass: string | null; readReplicaSourceDBInstanceIdentifier: string | null; }; resourceType: string; }, ruleParameters: { desiredInstanceType: string | null } ) { checkDefined(configurationItem, "configurationItem"); checkDefined( configurationItem.configuration, "configurationItem.configuration" ); checkDefined(ruleParameters, "ruleParameters"); // 実チェックの部分 if (configurationItem.resourceType !== "AWS::RDS::DBInstance") { return "NOT_APPLICABLE"; } else if ( ruleParameters.desiredInstanceType === configurationItem.configuration.dBInstanceClass ) { return "COMPLIANT"; } return "NON_COMPLIANT"; }ロールは
・AmazonRDSFullAccess
・AWSConfigRulesExecutionRole
・CloudWatchLogsFullAccess
を雰囲気で追加しています。AWS Config カスタムルール
ルール追加
カスタムルールの追加名前:適当
トリガータイプ:設定変更
変更範囲:リソース、RDS:DBInstance
ルールのパラメータ
キー:desiredInstanceType
値:db.t3.micro(任意のインスタンスタイプ)実行
AWS Configのコンソールから「再評価」を実行
評価結果を確認
- 投稿日:2020-05-14T23:06:54+09:00
AWS Educate のアカウントで AWS マネジメントコンソールにログインする
特に書いておくようなことではないかもしれませんが、ひと手間あるので一応。
まずは、 AWS Educate にログインしてください。
そのあと、画面右上の AWS Account をクリックして、AWS Educate Starter Account を申請してください。すでに申請済みの場合は、ここは無視してください。申請したあと、再読み込みすれば、以下のような画面になるので、AWS Educate Starter Account をクリックしてください。
あとは、 AWS Console をクリックしてください。
以上です。
AWS マネジメントコンソールは、一定時間でログアウトされますが、もう一度上記の手順を踏めば再ログインできます。少し面倒ですね。
関連記事
- 投稿日:2020-05-14T23:03:15+09:00
AWS EC2でcentosのAMIを使用する(python3/ffmpeg/dav2fsインストール)
はじめに
これまで、AWS EC2をお試しする際、AmazonLinux2ばかりを利用していましたが、極力一般的なパッケージ導入や手順を使いたく、CentOSを導入してみました。
なぜCentOSかというと、仕事ではRedhatLinuxも扱うこともあったり、AmazonLinux2も触ることを考え、OSとして類似のものがよいだろう・・・。という理由です。
導入
まずはAMIから素のOSを起動するのですが、CentOSのサイトにも最新のAMI情報がはっきり書いてありません・・・。
先人のお知恵を拝借し、AWS CLIで確認します。
aws ec2 describe-images --owners aws-marketplace \ --filters Name=product-code,Values=aw0evgkw8e5c1q413zgy5pjce \ --query "reverse(sort_by(Images, &CreationDate))[:5].[CreationDate, Description, ImageId]" \ --region ap-northeast-1最新のAMI IDをメモしておきます。
[ [ "2020-03-09T21:54:50.000Z", ←最新 "CentOS Linux 7 x86_64 HVM EBS ENA 2002_01", "ami-06a46da680048c8ae" ←このAMIを使用する。 ], [ "2019-01-30T23:44:22.000Z", "CentOS Linux 7 x86_64 HVM EBS ENA 1901_01", "ami-045f38c93733dd48d" ], ...略あとは、EC2起動時にAMIを指定するだけですが、初回利用時にはMarketplaceの利用許諾確認があります。
基本設定として変更した点
timezone、locale、keymap
$ sudo timedatectl set-timezone Asia/Tokyo $ sudo localectl set-locale LANG=ja_JP.UTF-8 $ sudo localectl set-keymap jp106yum update
とりあえずパッケージの最新化、基本的なパッケージも入れておく。
$ sudo yum update -y $ sudo yum install -y unzip wget bind-utils [参考] yumコマンド 入れているものの一覧 yum list installed リポジトリにあるリスト yum list availablepython3
デフォルトで導入できるパッケージはpython2の模様。
python.x86_64 2.7.5-86.el7https://qiita.com/shu1rou/items/3fac0fc0fcdafec051b7
https://weblabo.oscasierra.net/python3-centos7-yum-install/このあたりを拝見し、「IUS」とやらのリポジトリから導入する。
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm $ sudo yum install -y python36u ; python3 -V Python 3.6.8ffmpeg
とある目的の為に導入。こちらは「nux」とやらのリポジトリにある。
$ sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm $ sudo yum install -y ffmpeg $ ffmpeg -version ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers (略)Webdavをマウント(davfs2)
$ sudo yum install -y davfs2
- 投稿日:2020-05-14T22:57:40+09:00
【書籍まとめ】AWSアソシエイト直前対策テキスト(用語集)②
EC2
AWS上に仮想サーバーを構築して自由に利用できるのが特徴でEC2では仮想サーバの事を「インスタンス」という単位で扱う。ステートレス
systemが現在の状態(ステート)のデータを保持せず(レス)、外部から入力された内容によってのみ対応した出力が決まる方式。ステートフル
前後の状態を保持するのがステートフル。ELB
Elastic Load Balancing は、アプリケーションへのトラフィックを複数のターゲットに自動的に分散しますALB
ALBとは「Application Load Balancer」の略称で、高機能を有するロードバランシングサービスのことを指します。
レイヤ7で負荷分散し、対となるサーバー側の接続相手としてコンテナが使われることが多いELBのスティッキーセッション
ELBがサーバにリクエスト振り分ける際、特定のCookieを確認することで、特定のクライアントからのリクエストを特定のサーバに紐付けることが出来る機能ECS(Elastic Container Service)
AWSでコンテナを提供するサービスAuto Scaling
需要に対応し、自動的にインスタンスを増減させることができるサービススケーリングプランは以下のプランがある。
手動スケーリング
⇒パッチ処理など一時的な高負荷が予想される時ターゲットトラッキングスケーリング
⇒CPU使用率などの特定のターゲット値を一定に保つようにインスタンスを増減させる時ステップスケーリング
⇒アラームの段階を定義して、段階的にインスタンスを増減させる時シンプルスケーリング
⇒一つのしきい値に基づいてインスタンスを増減させる時スケジュールスケーリング
⇒営業時間中といった特定の時間にアクセス頻度が上がるという予測が出来る時。AWSでは固定サーバーとは異なり、必要な数だけ起動し
必要な時間だけ使用される。
こうしたリソースは、手動でセットアップする必要はなく、自動セットアップがベストプラクティスになる。
自動セットアップには下記アプローチがある。ブートストラップ
⇒起動時にCloud Formaitionなどでスクリプトを実行し環境構築するものです。ゴールデンイメージ
⇒EC2やRDSやEBSなどリソースのある時点でのスナップショットを取り、それを再起動させることで環境構築するものコンテナ
⇒ソフトウェアの実行に必要な全てのものをDockerイメージとしてパッケージ化するものであり、容易な構成管理と自動化を可能にする。AWS CloudFormation
リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにさらに注力できるようになりますAMI
Amazon マシンイメージは、ソフトウェア構成を記録したテンプレート、AMIからクラウドで仮想サーバーとして実行されるAMIのコピーであるインスタンスを起動する。AWS Elastic Beanstalk
Python、Ruby、Go および Docker を使用して開発されたウェブアプリケーションやサービスを使い慣れたサーバーでデプロイおよびスケーリングするための、使いやすいサービス
ードをアップロードするだけで、Elastic Beanstalk が、キャパシティのプロビジョニング、ロードバランシング、Auto Scaling からアプリケーションのヘルスモニタリングまで、デプロイを自動的に処理する。
- 投稿日:2020-05-14T20:01:28+09:00
Ruby on Rails チーム開発のデプロイで参考になった記事
プログラム勉強中です。自分の備忘録として投稿します。
チーム開発のデプロイで参考になった記事
- 【rails5.2】master.keyを本番環境(AWS EC2)に設定(追加作成)する方法
https://qiita.com/mylevel/items/4653f625ffabc7318a8a- 複数人で新規Railsプロジェクトを立ち上げる時の落とし穴
https://qiita.com/marlion7/items/aaf5fb8c86004b32194a- 【Rails5.2】秘匿情報はsecret.ymlではなくcredentials.yml.encで管理する【初心者】
https://qiita.com/15grmr/items/a687d0ed211ef60e751c
- 投稿日:2020-05-14T18:46:17+09:00
DockerでPython 3.8用のpsutilをインストールしてみた
動機
ことの始まりはとある先輩からのオーダー。。。
「最新のpyhon3系で動かしているlambdaのメモリ容量取得するようなコードかいてよ。」よっしわかったよ。
クソ野郎やってやろうじゃないかと意気込んでLambdaの最新のpython3系のランタイムをみたら、、、
python3.8.....になってた。えっ、、、いつのまに3.8に。。。。ということでpyrhon3.8かつamazonlinux2(Lambdaの実行環境がamazonlinuxとのことなので)で
インストールした外部ライブラリが必要になった。。。Dockerファイル
さくっとPython外部ライブラリを準備したかったのでDocker使いました。
Docker for Macです。python3.8をインストールするために作成したDockerファイルは下記の通り
FROM amazonlinux:2 RUN yum -y update RUN yum -y install gcc openssl-devel bzip2-devel libffi-devel RUN yum -y install wget RUN yum -y install tar RUN yum -y install gzip RUN yum -y install make RUN wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz RUN tar xzf Python-3.8.1.tgz RUN cd Python-3.8.1 RUN ./Python-3.8.1/configure --enable-optimizations RUN make altinstall RUN python3.8 --version RUN mkdir /home/deploy※もっとこう書けるよってのがあったら教えて下さい!
docker-compose.yml
さっきのDockerfileでpython3.8系はインストールできたので、外部ライブラリをpipでおとすためのdocker-compose.ymlは下記の通り
docker-compose.ymlversion: '2' services: app: build: . volumes: - './deploy:/home/deploy' command: pip3.8 install -r /home/deploy/requirements.txt -t /home/deploy/distrequirements.txtにはpsutilを書いてます。
※ちなみにディレクトリ構成はこんな感じ
. ├── docker-compose.yml ├── deploy │ ├── requirements.txt │ └── dist └── Dockerfile結論
こうやって落とした外部ライブラリとpythonのソースをzipで固めて、Lambdaにアップロードしたら正常にうごきました!
(外部ライブラリを使うときはランタイムと実行元のOSを使っておとした物を使わないといけないのが手間オブ手間s・・・)以上!
- 投稿日:2020-05-14T15:13:02+09:00
AWSのIPレンジが取得方法で異なるんだってさ
背景
対象のサービスを運用していて、見れる人を制限したかったので、SecurityGroupを利用していました
そこで、シンセティック監視をRoute 53 health checksを利用しようとしてました
ただ、監視をしつつ見れる人を制限する場合、Route 53 health checksのIPレンジが必要になるので
確認すると、取得方法が2種類あって、それぞれ微妙にIPが違ったのでその共有になります取得方法
Amazon Route 53 health checksのIPレンジを調べてたところ、取り方が下記の2パターンあります
- json
- SDK
1つ目のjsonとは、AWSがメンテしてるこちらのjsonから確認する方法です
2つ目のSDKとは、Route 53のSDKからレンジを確認する方法です。今回はPythonを使います環境
$ python --version Python 3.6.8 $ pip list | grep boto3 boto3 1.13.9確認
jsonの確認
>>> import requests >>> ip_ranges = requests.get('https://ip-ranges.amazonaws.com/ip-ranges.json').json()['prefixes'] >>> route53_ips_json = [item['ip_prefix'] for item in ip_ranges if item["service"] == "ROUTE53_HEALTHCHECKS"] >>> route53_ips_json ['54.252.254.192/26', '177.71.207.128/26', '54.255.254.192/26', '54.244.52.192/26', '54.251.31.128/26', '54.241.32.64/26', '54.245.168.0/26', '54.232.40.64/26', '54.248.220.0/26', '176.34.159.192/26', '54.252.79.128/26', '54.183.255.128/26', '54.250.253.192/26', '15.177.0.0/18', '54.228.16.0/26', '107.23.255.0/26', '54.243.31.192/26'] >>> len(route53_ips_json) 17SDKの確認
>>> import boto3 >>> client = boto3.client('route53') >>> route53_ips_sdk = client.get_checker_ip_ranges() >>> route53_ips_sdk['CheckerIpRanges'] ['15.177.2.0/23', '15.177.6.0/23', '15.177.10.0/23', '15.177.14.0/23', '15.177.18.0/23', '15.177.22.0/23', '15.177.26.0/23', '15.177.30.0/23', '15.177.34.0/23', '15.177.38.0/23', '15.177.42.0/23', '15.177.46.0/23', '15.177.50.0/23', '15.177.54.0/23', '15.177.58.0/23', '15.177.62.0/23', '54.183.255.128/26', '54.228.16.0/26', '54.232.40.64/26', '54.241.32.64/26', '54.243.31.192/26', '54.244.52.192/26', '54.245.168.0/26', '54.248.220.0/26', '54.250.253.192/26', '54.251.31.128/26', '54.252.79.128/26', '54.252.254.192/26', '54.255.254.192/26', '107.23.255.0/26', '176.34.159.192/26', '177.71.207.128/26'] >>> len(route53_ips_sdk['CheckerIpRanges']) 32違い
ということで、上記のように配列の長さが違うので、一致はしませんでした
で、どこが違うというと、下記のようになりました>>> set(route53_ips_json) - set(route53_ips_sdk['CheckerIpRanges']) {'15.177.0.0/18'} >>> set(route53_ips_sdk['CheckerIpRanges']) - set(route53_ips_json) {'15.177.18.0/23', '15.177.2.0/23', '15.177.42.0/23', '15.177.50.0/23', '15.177.34.0/23', '15.177.54.0/23', '15.177.10.0/23', '15.177.6.0/23', '15.177.26.0/23', '15.177.14.0/23', '15.177.46.0/23', '15.177.58.0/23', '15.177.38.0/23', '15.177.62.0/23', '15.177.22.0/23', '15.177.30.0/23'}つまり、15.177.0.0/18で大きく括ってるのがどうかが違ってました
まとめ
Route 53 health checksのIPレンジが取得方法によってIPレンジが異なりました
jsonで取得する方法だと一部大きくIPレンジを取っていて、SDKだと細かく切っている状態でした
どちらが正しいかと言われると正直怪しいですが、個人的にはSecurityGroupのメンテを少なくしたいので、
大きくとるjsonが良いのかなと思いました
- 投稿日:2020-05-14T14:54:05+09:00
AWS でEC2 のインスタンスを作成した
備忘録がてら。
aws にログインする。自分の場合は「Root user」でログインしてる。
パスワードを入力する。
「AWS Management Console」の「AWS services」に含まれる「EC2」を選択する。
画像下部の「Launch instance」をクリックすると、トグルが上方向に広がって出てくる。「Launch instance」を選択すると、インスタンスを生成する画面に移る。
画面右側の青いボタンが3つあるかと思う。自分は一番上の「64-bit(x86)」を選んだと思う。真ん中との違いはなん何だろう。5年保証がどうとか、各種環境が整ってるとか書いてる。どっちを選んでもLinux が使える。一番下はwindows が使える。
ここはデフォルトで進んだ。カーソルを乗せると何か注意書きが出てくるので、しっかり読もう。
右下の「Review and Launch」を押すと次に進む。
ここもそのまま右下の「Launch」をクリックして進んだように思う。
こんな画面が出てくる。公開鍵暗号方式で通信をするときに必要なキーペアを生成する画面らしい。
2つあるうちの上のトグルから「Create a new key pair」を選択すると新しいキーペアを得ることが出来る。ただし再生成は出来ないらしい。大事に保管しよう。
自分はとりあえず新しいキーペアを生成したが特に使用していない。
「Launch Instance」をクリックするとインスタンスが生成される。
- 投稿日:2020-05-14T14:44:23+09:00
JSON データを AWS Lambda Tool の Debug時に使用する形式に変換する
変換するアプリを Angular9 を使って作成してみました
https://sasaco.github.io/JsonToAwsLambdaToolsDebug/ソースコードは
https://github.com/sasaco/JsonToAwsLambdaToolsDebugアプリ作成手順
PS > ng new json-to-lambda-debug ? Would you like to add Angular routing? No ? Which stylesheet format would you like to use? SCSS [ https://sass-lang.com/documentation/syntax#scss ] CREATE json-to-lambda-debug/angular.json (3766 bytes) CREATE json-to-lambda-debug/package.json (1296 bytes) … CREATE json-to-lambda-debug/e2e/src/app.po.ts (301 bytes) √ Packages installed successfully.Angular アプリを起動してみる
> npm run start > json-to-lambda-debug@0.0.0 start C:\Users\sasaco\Documents\My Web Sites\JsonToLambdaDebug > ng serve ... chunk {vendor} vendor.js, vendor.js.map (vendor) 2.71 MB [initial] [rendered] Date: 2020-04-19T02:31:35.623Z - Hash: f1cca4d28e1cf91b561a - Time: 8052ms ** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ ** : Compiled successfully.
http://localhost:4200/
にアクセスするアプリの最終形
- 投稿日:2020-05-14T12:05:28+09:00
Active Direcroty 統合管理の夢(WorkMail編)
構成図
全体像
WorkMailは東京リージョンで提供されていないので(2020/5)、Active Directory(以下AD)と統合するため、
1. 東京リージョンとバージニア北部リージョンを VPC Peering で接続する。
2. バージニア北部リージョンに東京リージョンの Microsoft AD を参照する AD Connector を起動する。
3. バージニア北部リージョンに作成した AD Connector をディレクトリとして WorkMail を起動する。VPC ppering
① VPC peeringを作成する。
東京リージョンでVPC peeringを作成した後、バージニア北部に移動して、承諾すると接続されます。
② ルートテーブルに相互接続のルートを追加する。
東京リージョンVPCのCIDRを、バージニア北部リージョンのルートテーブルに追加します。ターゲットはVPC peeringにします。
バージニア北部VPCのCIDRも、東京リージョンのルートテーブルに追加します。
AD Connector
② peering設定のあるVPCに設置する。
VPC peeringによりActive Directoryと疎通の取れるVPCにAD Connectorを設置する。
WorkMail
① WorkMailのOrganizationを作成する。
AD Connectorに接続するため、Standard Setupを選択する。
② DirectoryにAD Connectorを選択する。
③ Active Directoryのユーザが登録されているのを確認する。
完!
参考
VPC ピアリング接続の作成と承認
https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/create-vpc-peering-connection.htmlAD Connector の作成
https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/create_ad_connector.html
- 投稿日:2020-05-14T11:11:21+09:00
EC2のhost名でSSM経由なSSH接続をしたい
AWS SSMって便利ですよね
SSHのポートを開ける必要無し・踏み台不要でec2に接続できるという神ツールです_SSMの手順についてはAWSのドキュメント(Session Managerの開始方法)・他の方が書かれているのでそちらを見てください
ですが、個人的に1点不満が・・・
Instance IDを指定しないといけない!.ssh/configHost i-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"上の設定だとInstanceIDをawscliで確認して・・・と、かなりメンドクセ
host名で接続できるようにするために以下のように書くというのもできますが、
.ssh/configHost dev01 HostName i-xxxxxxxxxxxxxxxxx ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'" Host web01 HostName i-xxxxxxxxxxxxxxxxx ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"インスタンスが増えた or インスタンスを作り直したら
.ssh/config
を修正と正直これもメンドクセそこで、ssmのコマンドのwrapperを作成しました
コードはこんな感じssm_proxy.py#!/usr/bin/python import sys import subprocess import argparse from boto3.session import Session def start_session(profile, hostname, port): session = Session(profile_name = profile) client = session.client('ec2') try: response = client.describe_instances( Filters = [ { 'Name': 'tag:Name', 'Values': [hostname] } ] ) except: return subprocess.call([ 'aws', '--profile', profile, 'ssm', 'start-session', '--target', response['Reservations'][0]['Instances'][0]['InstanceId'], '--document-name', 'AWS-StartSSHSession', '--parameters', 'portNumber={0}'.format(port), ]) def main(): parser = argparse.ArgumentParser( formatter_class = argparse.RawTextHelpFormatter ) parser.add_argument('--profile') parser.add_argument('--host') parser.add_argument('--port') args = parser.parse_args() start_session(args.profile, args.host, args.port) sys.exit(0) if __name__ == '__main__': main()tagのNameとしてhost名を設定しておき、tagからInstanceIDを取得してawscliでssmのsessionを開始するという単純なものです
これを.ssh/config
のProxyCommandとして設定します.ssh/configHost * ProxyCommand sh -c "ssm_proxy.py --host %h --port %p"実際には複数アカウントがあるのでhost名のprefixに各profileの名前を付けて置き、下のように設定しています
.ssh/configHost yzrh-* ProxyCommand sh -c "ssm_proxy.py --profile yuzuriha --host %h --port %p" Host acc1-* ProxyCommand sh -c "ssm_proxy.py --profile account1 --host %h --port %p"最初に
describe_instances
を実行するのでsshが接続されるまで若干遅いですが、今までのメンドクサさからすると許容範囲かな・・・
- 投稿日:2020-05-14T10:44:20+09:00
AWSのEC2(CentOS 7)でTimezoneの変更でミスった・・・
事象
CentOS7なEC2のサーバ上のPHPで、TimeZoneにUTCを指定して時刻を取得したのにJSTな時刻が取得された。
なお、OSのタイムゾーンは一応JSTです。
原因
タイムゾーンがおかしなことになってました。
$ timedatectl Local time: Wed 2020-05-13 14:14:59 JST Universal time: Wed 2020-05-13 05:14:59 UTC RTC time: Wed 2020-05-13 05:13:52 Time zone: UTC (JST, +0900) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/aって感じで、TimezoneがUTC (JST, +0900)と不思議な値になってました。
どうしてこうなった
EC2は初期ではタイムゾーンがUTCになってます。
これをJSTに変更する方法はぐぐるといっぱい出てきますが、大きく2種類出てきます。
- /etc/localtimeを変更する方法
- timedatectlを使う方法
CentOS7の場合は、「timedatectlを使う方法」なんですが、「/etc/localtimeを変更する方法」をやってしまいました。
やったこと
- sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
- vi /etc/sysconfig/clock → そんなファイルないぞ? ここで気づくべきでした(まぁ、ここできづいても遅いんですが・・・)
しかし、2をやらすにとりあえず、dateしてみると、JSTになってるからまぁいいかってことでタイムゾーンの変更完了!ってしちゃいました。
なにが起きたのか
実は、 /ect/localtime が /usr/share/zoneinfo/UTC のシンボリックリンクになってました。
つまり、
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
で/usr/share/zoneinfo/UTCが/usr/share/zoneinfo/Japanで上書きされてしまいました。
結果、UTCの内容がJSTで+0900になってしまったということでした。さらに、UCTとかUniversalとかZuluとかがUTCのハードリンクだったらしく、これらもJSTになっちゃってました・・・
- 投稿日:2020-05-14T10:37:29+09:00
作成済みのEC2インスタンスにセキュリティグループを追加する
はじめに
本記事は「割り当て済みのセキュリティグループにルールを追加」ではなく、「割り当てるセキュリティグループを追加」したい場合のメモです。
複数割り当てることは可能とされていますが、現在コンソールからは1つしか設定できません。
下記注記の通り、ルールはできるだけ絞ることを推奨しているようなので注意してください。複数のセキュリティグループをインスタンスに関連付けると、各セキュリティグループのルールが効率的に集約され、1 つのルールセットが作成されます。このルールセットを使用して、アクセスを許可するかどうかを判断します。
注記
複数のセキュリティグループを 1 つのインスタンスに割り当てることができるため、インスタンスには数百単位のルールを適用できます。結果として、インスタンスにアクセスするときに問題が発生する可能性があります。そのため、ルールは可能な限り要約することをお勧めします。
Linux インスタンスの Amazon EC2 セキュリティグループ - Amazon Elastic Compute Cloud追加する方法
AWS CLI を利用すると追加できます。
前提
- EC2インスタンスが作成済みであること
- 対象のEC2インスタンスとセキュリティグループがすべて同一のVPC上にあること
コマンド
aws ec2 modify-instance-attribute --instance-id "インスタンスID" --groups "セキュリティグループID1" "セキュリティグループID2" ...※設定を追加ではなく変更するためのコマンドなので、すでに割り当て済みのIDを含めて指定しないと消えます。
参考
modify-instance-attribute — AWS CLI 1.18.59 Command Reference
- 投稿日:2020-05-14T08:45:05+09:00
バックアップを取りつつS3バケットのオブジェクトを再度PUTする方法
概要
この記事がやることは、AWS-CLIを用いて、指定したパスのファイルを全部DLして再度同じパスにDLしたファイルをアップロードする。
実施の経緯
S3バケットの指定したパス配下のオブジェクトを再度PUTしたかった。
再度PUTすることで、PUTイベントで発火するプログラムの動作確認を行いたかった。やりかた
指定したパス配下をまるっとダウンロード
DIR_PATH={your-dir-path} aws s3 cp --profile {your-profile} --recursive --exclude="*" --include="${DIR_PATH}/*" s3://your-bucketname ./ >> ./logs/download_log.txtダウンロードしたファイルをまるっと同じパスにアップロード
DIR_PATH={your-dir-path} aws s3 cp --profile {your-profile} --recursive --exclude="*" --include="${DIR_PATH}/*" ./ s3://your-bucketname >> ./logs/upload_log.txt補足
ログをとったり、実施前に
--dryrun
のオプションを付けて実施内容を確認するとよいと思います。
- 投稿日:2020-05-14T05:59:27+09:00
[AWS] API GatewayとJSONサーバーで動的htmlレンダリングしてみた。
API GatewayとJSONサーバーで動的htmlレンダリングしてみた。
AWSのAPI GatewayとDynamoDBとLambdaでサービス構築してみたかった動機があったので、今回はAPI Gatewayを触ってみた。
- 特定URLにWebブラウザでアクセスする
- API GatewayがJSONデータを取得して、htmlにレンダリングして表示する
というシンプルな構造です。
今回はやらないが、API Gatewayは統合リクエストなどの機能を使えばLambdaを挟まなくてもDynamoDBにアクセスできます。なので、
/1
にアクセスするとDynamoDBのあるテーブルのid 1
にアクセスして必要なデータをJSON形式で取得して、そのデータをAPIGatewayの統合レスポンスでhtmlにマッピングして返す、みたいな簡単なWEBアプリケーションが作れます。その触りだけ書いて行きます。やりかた
REST APIとかで作る。
こんな感じで適当に作り
GETメソッドを追加する
エンドポイントに https://jsondata.okiba.me/v1/json/PiWpM200513171710 みたいなJSONを返してくれるURLをいれる。Lambdaとかに接続させてもいいがその場合は
AWSサービス
を選びゴニョゴニョしてください。後ほど書きますがMockだと、統合レスポンスでマッピングできなくてハマります。今回の帰ってくるデータはこれ
{ "statusCode": 200, "body": [ { "id": 1, "name": "JavaScript", "tel": "08000000000" }, { "id": 2, "name": "Object", "tel": "09000000000" }, { "id": 3, "name": "Node", "tel": "07000000000" } ] }次はここの
メソッドレスポンス
と統合レスポンス
をいじる。メソッドレスポンスで
200
のステータスでtext/html
がブラウザに帰るように設定する。
このあたりのapplication/json
をtext/html
に変えたらおk。次は統合レスポンスですが、これもこのあたりの
application/json
をtext/html
に変えたらおk。
https://jsondata.okiba.me/v1/json/PiWpM200513171710 が200を返したときの処理しか書いてないが一旦これでOK#set($inputRoot = $input.path('$.body')) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css" /> <title>API Gateway</title> </head> <body> <h1>Qiitaテスト</h1> <table border="1"> <tr> <td>id</td> <td>name</td> <td>tel</td> </tr> #foreach($elem in $inputRoot) <tr> <td>$elem.id</td> <td>$elem.name</td> <td>$elem.tel</td> </tr> #end </table> </body> </html>マッピングはVTLという名前のテンプレートエンジン?
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#foreach($elem in $inputRoot) <tr> <td>$elem.id</td> <td>$elem.name</td> <td>$elem.tel</td> </tr> #endで、一個前の画面に戻っての
テスト⚡
テストとかぽちぽちしてると、ちゃんとhtmlが帰ってくれるならおk。
APIのデプロイして、誰でもアクセスできるようにして、ステージ名は適当に
develop
とかstage
とかでいいと思う。https://XXXXXXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/stage
みたいなURLが発行されて完了です。
Mockを統合レスポンスで使おうとしてハマった話
絵でいうとここが
$input.json('$')
が使えなかったので2週間くらいハマってました(途中でこころ折れたりしながらの二週間)スタック・オーバーフローに 書いてました。
以前 JSONを返す無料APIを3分で作る方法 を書きましたが、今回は https://jsondata.okiba.me/ さんを使わせてもらいました。リクエストを噛まさずにAWSサービス内で完結させようと思ってのMOCKでしたが見事にハマりました。
- 投稿日:2020-05-14T01:17:37+09:00
cloudfront から S3 バケット内の特定のファイルへのアクセス制限をするためにはオリジンアクセスアイデンティティを使う
概要
cloudfront で配信している SPA でメンテナンスページを作成するとき、静的な HTML ファイルを S3 に置くが cloudfront からは「/maintenance.html」のように URL 直打ちだとアクセスできないようにしたい、というケースがありました。maintenance.html は URL 直打ちではなく SPA の制御によってレンダリングされます。
その際のメモです。オリジンアクセスアイデンティティを使う
S3 のバケットポリシーでオリジンアクセスアイデンティティを使って cloudfront からのアクセスを制御することによって上記のケースを実現できます。
{ "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity TESTTEST" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test/*" }, { "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity TESTTEST" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test/maintenance.html" } ] }上記のポリシーでは Deny を使って maintenance.html への直アクセスを禁止しています。
- 投稿日:2020-05-14T00:39:00+09:00
AWS基礎(1)
Amazon Web Servicesの基礎知識
AWSの特徴、仕組みを超ざっくりまとめます。
AWSとは
一言でいうと「クラウドコンピューティングサービスの1つ」
その他Microsoft AzureやGoogle Cloud Platformなど「クラウドコンピューティングサービス」とは
サーバやネットワークなどをインターネット経由で貸してくれるサービス。AWSの多様なサービスを組み合わせることでアプリケーションやインフラを実現できる。
多様なサービスとは(代表例5個)
1, Amazon EC2 (Amazon Elastic Compute Cloud)
仮想サーバー。詳しくは後ほど。2, Amazon S3 (Amazon Simple Storage Service)
汎用的なクラウドストレージ。3, Amazon RDS (Amazon Relational Database Service)
リレーショナルデータベース。4, Amazon VPC (Amazon Virtual Private Cloud)
AWSアカウント専用の仮想ネットワーク環境。5, AWS IAM (AWS Identity and Access Management)
AWSにおける認証機能。AWSの仕組み
操作性、利便性、安全性について。
1, マネジメントコンソール
Webブラウザ上のGUIで操作できる画面。
GUI:グラフィカルユーザーインターフェース2, マネージドサービス
バックアップやアップデートが自動で行われる。(管理者が手動で行う必要がない)3, セキュリティ
運用作業は自動で行われるので、一定の水準は期待できる。まとめ
個人的に魅力的だと思った点
・システム運用に必要なサービス一式を丸ごと借りられる。
・GUIで操作できる。
・自動で運用してくれる。あとAWSクラウド無料枠というのがあるみたい。
- 投稿日:2020-05-14T00:39:00+09:00
AWS基礎
Amazon Web Servicesの基礎知識
AWSの特徴、仕組みを超ざっくりまとめます。
AWSとは
一言でいうと「クラウドコンピューティングサービスの1つ」
その他Microsoft AzureやGoogle Cloud Platformなど「クラウドコンピューティングサービス」とは
サーバやネットワークなどをインターネット経由で貸してくれるサービス。AWSの多様なサービスを組み合わせることでアプリケーションやインフラを実現できる。
多様なサービスとは(代表例5個)
1, Amazon EC2 (Amazon Elastic Compute Cloud)
仮想サーバー。詳しくは後ほど。2, Amazon S3 (Amazon Simple Storage Service)
汎用的なクラウドストレージ。3, Amazon RDS (Amazon Relational Database Service)
リレーショナルデータベース。4, Amazon VPC (Amazon Virtual Private Cloud)
AWSアカウント専用の仮想ネットワーク環境。5, AWS IAM (AWS Identity and Access Management)
AWSにおける認証機能。AWSの仕組み
操作性、利便性、安全性について。
1, マネジメントコンソール
Webブラウザ上のGUIで操作できる画面。
GUI:グラフィカルユーザーインターフェース2, マネージドサービス
バックアップやアップデートが自動で行われる。(管理者が手動で行う必要がない)3, セキュリティ
運用作業は自動で行われるので、一定の水準は期待できる。まとめ
個人的に魅力的だと思った点
・システム運用に必要なサービス一式を丸ごと借りられる。
・GUIで操作できる。
・自動で運用してくれる。あとAWSクラウド無料枠というのがあるみたい。
- 投稿日:2020-05-14T00:22:44+09:00
Docker composeでWordpressマルチサイトの開発環境構築する備忘録
個人的な備忘録
Wordpressマルチサイト
1つのWordPressで複数のサイトを運用可能にすることで、共通のテンプレートやプラグインが利用できる機能
対応していないプラグインもあるが、全体で共通で利用するだけでなく、サイトごとに個別で有効化することもできる
機能として以下の3種類があるサブディレクトリ型 マルチサイト
- kamihork.com/site1
- kamihork.com/site2
サブドメイン型 マルチサイト
- site1.kamihork.com
- site2.kamihork.com
複数ドメイン型 マルチサイト
- site1-kamihork.com
- site2-kmaihork.com
Wordpressマルチサイトでの、サブドメイン形式での構築手順
サブドメイン形式を選択する場合、予約済みドメイン(localhost)だとそれを実現できない
なので、これを実現するのに、lvh.meというループバックドメインを利用する
※ 参考 : https://techracho.bpsinc.jp/ebi/2020_04_23/91311lvh.me
2020/5/14時点での、有効期限は1年間ぐらいある
$ whois lvh.me | grep Expiry Registry Expiry Date: 2021-06-02T00:35:34Z手順
Dockerを確認
$ docker -v Docker version 18.09.2, build 6247962 $ docker-compose -v docker-compose version 1.23.2, build 1110ad01docker-compose.ymlを作成
docker-compose.ymlversion: '1.0' services: db: image: mysql:5.7 volumes: - ./mysql:/var/lib/mysql ports: - 3306:3306 networks: - wpnet environment: - MYSQL_DATABASE=kamihork-db - MYSQL_USER=kamihork - MYSQL_PASSWORD=pass - MYSQL_ROOT_PASSWORD=root app: build: context: ./app dockerfile: Dockerfile volumes: - ./html:/var/www/html - ./wp-install.sh:/tmp/wp-install.sh ports: - 80:80 depends_on: - db networks: - wpnet cli: image: wordpress:cli-2.3.0-php7.1 volumes_from: - app:rw networks: - wpnet networks: wpnet:Dockerファイルを作成
FROM php:7.1-apache RUN \ { apt-get update; \ apt-get install -y zlib1g-dev libzip-dev; \ docker-php-ext-install zip; \ docker-php-ext-install mysqli; \ docker-php-ext-configure zip; \ docker-php-ext-configure mysqli ; \ }wordpress cliを利用してもろもろ初期設定をするshellを作成
プラグインのインストールは、wp plugin install で可能
マルチサイトのインストールは、 wp core multisite-install で可能wp-install.sh#!/bin/bash set -ex; INSTALLDIR=/var/www/html wp core download \ --locale=ja --version=5.2.2 --path=${INSTALLDIR} wp config create \ --dbname=kamihork-db --dbuser=kamihork --dbpass=pass --dbhost=db:3306 \ --force --path=${INSTALLDIR} wp core multisite-install \ --url=www.lvh.me --subdomains --title='kamihorkのマルチサイト' \ --admin_user=kamihork --admin_password=pass --admin_email=hoge@fuga.com --allow-root wp site create \ --slug=sub --title='kamihorkのマルチサイト @サブ' --allow-rootコンテナを起動
$ docker-compose up -d --build用意したシェルを実行
# ログイン $ docker-compose run --rm cli bash # 権限変える $ chmod +x /tmp/wp-install.sh # 実行 $ /tmp/wp-install.shコンテナを削除終了
$ docker-compose down --volumesプロセス確認
$ docker psimage確認
$ docker imagesサイトの確認
本体サイト
http://lvh.me/ http://lvh.me/wp-admin/index.phpサブドメインサイト
http://sub.lvh.me/ http://sub.lvh.me/wp-admin/index.php参考記事など
Docker選定に関する記事
Dockerとは
迷える子羊に捧げるコンテナ環境徹底比較
Docker導入するべき?するべきではない?マルチサイトについて
WordPressマルチサイトとは?メリットデメリット丸わかり
複数のWordPressでサブドメインを運用する5つのポイント
WordPressマルチサイト対応プラグインの作り方
ループバックドメインの有効期限AWS+Wordpressに関する記事
Dockerの利用
Dockerを利用したWordPressの開発環境をwp-cliを使ってさくっと構築する
Docker Composeを使ってWordPressが動作するローカル環境を作る
lvh.meドメインを使って、サブドメイン形式のWordPressマルチサイトのDocker開発環境構築
docker-compose コマンドまとめ
docker-compose.ymlの書き方について解説してみた
DockerfileとはAWS EC2 の利用
WordPress を Amazon EC2 インスタンスにデプロイする
WordPress ウェブサイトを構築する
小中規模向け低コストで可用性/拡張性の高いWordPress アーキテクチャ
AWS の WordPress High Availability by Bitnami
AWS再入門2018 WordPress on AWS編
[和訳]WordPress ベストプラクティス on AWSAWS ECS の利用
Amazon ECSの主な機能と使い方
WordPressをAWSのDockerで公開
Docker環境をAWS ECSでデプロイするまで
AWS ECSでDockerコンテナ管理入門
CodePipelineからECSにBlue/Greenデプロイする