20200514のAWSに関する記事は21件です。

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 mail

Please 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.

このような内容を伝える必要がある事があらかじめ分かっていれば、スムーズにやり取りできるのですが・・・。

色々調べた限りでは、半年ぐらい前に書かれた記事ではすんなり申請が通っているようなので、ここ最近は確認が厳しくなったのか、私がたまたま深く突っ込まれたのか、どちらかかと思っています。(真相は謎ですが)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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のコンソールから「再評価」を実行
評価結果を確認

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Educate のアカウントで AWS マネジメントコンソールにログインする

特に書いておくようなことではないかもしれませんが、ひと手間あるので一応。

まずは、 AWS Educate にログインしてください。
そのあと、画面右上の AWS Account をクリックして、AWS Educate Starter Account を申請してください。すでに申請済みの場合は、ここは無視してください。

image.png

申請したあと、再読み込みすれば、以下のような画面になるので、AWS Educate Starter Account をクリックしてください。

image.png

あとは、 AWS Console をクリックしてください。

image.png

以上です。

AWS マネジメントコンソールは、一定時間でログアウトされますが、もう一度上記の手順を踏めば再ログインできます。少し面倒ですね。

関連記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 jp106

yum update

とりあえずパッケージの最新化、基本的なパッケージも入れておく。

$ sudo yum update -y
$ sudo yum install -y unzip wget bind-utils

[参考] yumコマンド
 入れているものの一覧
 yum list installed

 リポジトリにあるリスト
 yum list available 

python3

デフォルトで導入できるパッケージはpython2の模様。
python.x86_64 2.7.5-86.el7

https://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.8

ffmpeg

とある目的の為に導入。こちらは「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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【書籍まとめ】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 からアプリケーションのヘルスモニタリングまで、デプロイを自動的に処理する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Rails チーム開発のデプロイで参考になった記事

プログラム勉強中です。自分の備忘録として投稿します。

チーム開発のデプロイで参考になった記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: '2'
services:
  app:
    build: .
    volumes:
     - './deploy:/home/deploy'
    command: pip3.8 install -r /home/deploy/requirements.txt -t /home/deploy/dist

requirements.txtにはpsutilを書いてます。

※ちなみにディレクトリ構成はこんな感じ

.
├── docker-compose.yml
├── deploy
│   ├── requirements.txt
│   └── dist
└── Dockerfile

結論

こうやって落とした外部ライブラリとpythonのソースをzipで固めて、Lambdaにアップロードしたら正常にうごきました!
(外部ライブラリを使うときはランタイムと実行元のOSを使っておとした物を使わないといけないのが手間オブ手間s・・・)

以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSのIPレンジが取得方法で異なるんだってさ

背景

対象のサービスを運用していて、見れる人を制限したかったので、SecurityGroupを利用していました
そこで、シンセティック監視をRoute 53 health checksを利用しようとしてました
ただ、監視をしつつ見れる人を制限する場合、Route 53 health checksのIPレンジが必要になるので
確認すると、取得方法が2種類あって、それぞれ微妙にIPが違ったのでその共有になります

取得方法

Amazon Route 53 health checksのIPレンジを調べてたところ、取り方が下記の2パターンあります

  1. json
  2. 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)
17

SDKの確認

>>> 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が良いのかなと思いました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS でEC2 のインスタンスを作成した

備忘録がてら。

aws にログインする。自分の場合は「Root user」でログインしてる。

パスワードを入力する。

「AWS Management Console」の「AWS services」に含まれる「EC2」を選択する。
Screenshot from 2020-05-14 14-11-05.png


画像下部の「Launch instance」をクリックすると、トグルが上方向に広がって出てくる。「Launch instance」を選択すると、インスタンスを生成する画面に移る。
Screenshot from 2020-05-14 14-13-14.png


画面右側の青いボタンが3つあるかと思う。自分は一番上の「64-bit(x86)」を選んだと思う。真ん中との違いはなん何だろう。5年保証がどうとか、各種環境が整ってるとか書いてる。どっちを選んでもLinux が使える。一番下はwindows が使える。
Screenshot from 2020-05-14 14-20-05.png


ここはデフォルトで進んだ。カーソルを乗せると何か注意書きが出てくるので、しっかり読もう。
右下の「Review and Launch」を押すと次に進む。
Screenshot from 2020-05-14 14-25-07.png


ここもそのまま右下の「Launch」をクリックして進んだように思う。
Screenshot from 2020-05-14 14-28-06.png


こんな画面が出てくる。公開鍵暗号方式で通信をするときに必要なキーペアを生成する画面らしい。
2つあるうちの上のトグルから「Create a new key pair」を選択すると新しいキーペアを得ることが出来る。ただし再生成は出来ないらしい。大事に保管しよう。
自分はとりあえず新しいキーペアを生成したが特に使用していない。
「Launch Instance」をクリックするとインスタンスが生成される。
Screenshot from 2020-05-14 14-30-29.png


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.

こうなった
image.png

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/ にアクセスする

image.png

アプリの最終形

image.png

ソースコードは
https://github.com/sasaco/JsonToAwsLambdaToolsDebug

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Active Direcroty 統合管理の夢(WorkMail編)

構成図

image.png

全体像

WorkMailは東京リージョンで提供されていないので(2020/5)、Active Directory(以下AD)と統合するため、
1. 東京リージョンとバージニア北部リージョンを VPC Peering で接続する。
2. バージニア北部リージョンに東京リージョンの Microsoft AD を参照する AD Connector を起動する。
3. バージニア北部リージョンに作成した AD Connector をディレクトリとして WorkMail を起動する。

VPC ppering

① VPC peeringを作成する。

東京リージョンでVPC peeringを作成した後、バージニア北部に移動して、承諾すると接続されます。

image.png


② ルートテーブルに相互接続のルートを追加する。

東京リージョンVPCのCIDRを、バージニア北部リージョンのルートテーブルに追加します。ターゲットはVPC peeringにします。
バージニア北部VPCのCIDRも、東京リージョンのルートテーブルに追加します。

image.png


AD Connector

① AD Connectorを作成する。
image.png

② peering設定のあるVPCに設置する。
VPC peeringによりActive Directoryと疎通の取れるVPCにAD Connectorを設置する。
image.png

WorkMail

① WorkMailのOrganizationを作成する。
AD Connectorに接続するため、Standard Setupを選択する。
image.png

② DirectoryにAD Connectorを選択する。
image.png

③ Active Directoryのユーザが登録されているのを確認する。
image.png

完!

参考

VPC ピアリング接続の作成と承認
https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/create-vpc-peering-connection.html

AD Connector の作成
https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/create_ad_connector.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2のhost名でSSM経由なSSH接続をしたい

AWS SSMって便利ですよね
SSHのポートを開ける必要無し・踏み台不要でec2に接続できるという神ツールです

_SSMの手順についてはAWSのドキュメント(Session Managerの開始方法)・他の方が書かれているのでそちらを見てください

ですが、個人的に1点不満が・・・
Instance IDを指定しないといけない!

.ssh/config
Host i-*
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

上の設定だとInstanceIDをawscliで確認して・・・と、かなりメンドクセ

host名で接続できるようにするために以下のように書くというのもできますが、

.ssh/config
Host 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/config
Host *
  ProxyCommand sh -c "ssm_proxy.py --host %h --port %p"

実際には複数アカウントがあるのでhost名のprefixに各profileの名前を付けて置き、下のように設定しています

.ssh/config
Host 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が接続されるまで若干遅いですが、今までのメンドクサさからすると許容範囲かな・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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種類出てきます。

  1. /etc/localtimeを変更する方法
  2. timedatectlを使う方法

CentOS7の場合は、「timedatectlを使う方法」なんですが、「/etc/localtimeを変更する方法」をやってしまいました。

やったこと

  1. sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
  2. 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になっちゃってました・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

作成済みの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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

daw

dwa

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

バックアップを取りつつ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のオプションを付けて実施内容を確認するとよいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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とかで作る。

スクリーンショット 2020-05-14 5.12.04.png

こんな感じで適当に作り

スクリーンショット 2020-05-14 5.12.37.png

GETメソッドを追加する

スクリーンショット 2020-05-14 5.13.08.png

エンドポイントに 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"
    }
  ]
}

スクリーンショット 2020-05-14 5.13.47.png

次はここの メソッドレスポンス統合レスポンス をいじる。

スクリーンショット 2020-05-14 5.44.49.png

メソッドレスポンスで 200 のステータスで text/html がブラウザに帰るように設定する。
このあたりの application/jsontext/html に変えたらおk。

スクリーンショット 2020-05-14 5.48.26.png

次は統合レスポンスですが、これもこのあたりの application/jsontext/html に変えたらおk。
https://jsondata.okiba.me/v1/json/PiWpM200513171710 が200を返したときの処理しか書いてないが一旦これでOK

スクリーンショット 2020-05-14 5.49.48.png

#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

で、一個前の画面に戻っての テスト⚡

スクリーンショット 2020-05-14 5.44.49.png

テストとかぽちぽちしてると、ちゃんとhtmlが帰ってくれるならおk。

スクリーンショット 2020-05-14 5.55.08.png

APIのデプロイして、誰でもアクセスできるようにして、ステージ名は適当に develop とか stage とかでいいと思う。

スクリーンショット 2020-05-14 5.56.01.png

https://XXXXXXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/stage

みたいなURLが発行されて完了です。

スクリーンショット 2020-05-14 5.57.52.png

Mockを統合レスポンスで使おうとしてハマった話

スクリーンショット 2020-05-14 2.07.22.png

絵でいうとここが $input.json('$') が使えなかったので2週間くらいハマってました(途中でこころ折れたりしながらの二週間)

スタック・オーバーフローに 書いてました。

以前 JSONを返す無料APIを3分で作る方法 を書きましたが、今回は https://jsondata.okiba.me/ さんを使わせてもらいました。リクエストを噛まさずにAWSサービス内で完結させようと思ってのMOCKでしたが見事にハマりました。

https://jsondata.okiba.me/v1/json/PiWpM200513171710

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 への直アクセスを禁止しています。

参考:
オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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クラウド無料枠というのがあるみたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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クラウド無料枠というのがあるみたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/91311

lvh.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 1110ad01

docker-compose.ymlを作成

docker-compose.yml
version: '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 ps

image確認

$ 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 AWS

AWS ECS の利用

Amazon ECSの主な機能と使い方
WordPressをAWSのDockerで公開
Docker環境をAWS ECSでデプロイするまで
AWS ECSでDockerコンテナ管理入門
CodePipelineからECSにBlue/Greenデプロイする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む