git でリモートリポジトリに ssh するときに Permission denied (publickey).

概要

ローカルからリモートリポジトリに push しようとして以下のエラーが出ちゃったときの話。

$ git push origin master
username@hostname.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

環境

実施手順

1. 鍵の作成

$ ssh-keygen -t rsa -b 4096 -C "your@address.com"

2. ~/.ssh/config の設定

Host backlog
  User username
  HostName hostname.com
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  port 22

ここまでやって、リモートリポジトリに push したらエラーになったので、以下実施。

3. ssh-agent に秘密鍵を追加

$ eval `ssh-agent`
Agent pid XXXXX
$ ssh-add ~/.ssh/id_rsa
Identity added: /c/Users/name/.ssh/id_rsa (/c/Users/name/.ssh/id_rsa)

4. 鍵の登録状態を確認

$ ssh-add -l
4096 SHA256:XXXXXXX/XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXX /c/Users/name/.ssh/id_rsa (RSA)

リモートリポジトリに push して成功。

CloudWatchのログをS3に送る

以下記事の続き。

dafukui.hatenablog.com

今回は以下のイメージで、EC2で稼働するApacheのログデータをS3に保管したいと思います。

f:id:dafukui:20190522183714p:plain

Kinesis Firehose の設定

WEBコンソールで設定します。

Firehoseの配信ストリームの作成に進む。

f:id:dafukui:20190524100658p:plain

f:id:dafukui:20190524112812p:plain

f:id:dafukui:20190524112814p:plain

f:id:dafukui:20190524112816p:plain

f:id:dafukui:20190524113300p:plain

送信されるデータは標準で圧縮処理が行われているため、Firehose側での対応は不要です。

CloudWatch Logs から Amazon Kinesis Data Firehose に送信されたデータは、すでに gzip レベル 6 圧縮で圧縮されているため、Kinesis Data Firehose 配信ストリーム内で圧縮を使用する必要はありません。

docs.aws.amazon.com

f:id:dafukui:20190524112819p:plain

IAM roleは作成後に選択を行うことで設定に反映されます。

ログ転送に必要な設定を awscli で実施

まず、設定に使用する以下のファイルを作成します。

  • TrustPolicyForCWL.json
{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }
}
  • PermissionsForCWL.json
{
  "Statement":[
    {
      "Effect":"Allow",
      "Action":["firehose:*"],
      "Resource":["arn:aws:firehose:ap-northeast-1:999999999999:*"]
    },
    {
      "Effect":"Allow",
      "Action":["iam:PassRole"],
      "Resource":["arn:aws:iam::999999999999:role/CWLtoKinesisFirehoseRole"]
    }
  ]
}

docs.aws.amazon.com

今回は以下のような構造にしました。

CWLtoKinesisFirehose/
┣ PermissionsForCWL.json
┗ TrustPolicyForCWL.json

続いて、信頼ポリシーに CloudWatch を指定するIAMロールを作成します。 このロールは CloudWatch だけが引き受けることのできる限定的なロールです。

ubuntu@ip-10-0-0-183:~/CWLtoKinesisFirehose$ aws iam create-role \
>       --role-name CWLtoKinesisFirehoseRole \
>       --assume-role-policy-document file://~/CWLtoKinesisFirehose/TrustPolicyForCWL.json
{
    "Role": {
        "Path": "/",
        "RoleName": "CWLtoKinesisFirehoseRole",
        "RoleId": "AROA4DFXVDA2FTKIJUU62",
        "Arn": "arn:aws:iam::999999999999:role/CWLtoKinesisFirehoseRole",
        "CreateDate": "2019-05-24T00:48:46Z",
        "AssumeRolePolicyDocument": {
            "Statement": {
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.ap-northeast-1.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        }
    }
}

Firehoseに対してログデータの送信を許可するポリシーを先ほど作成したCWLtoKinesisFirehoseRoleに設定します。

ubuntu@ip-10-0-0-183:~/CWLtoKinesisFirehose$ aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole \
>     --policy-name Permissions-Policy-For-CWL \
>     --policy-document file://~/CWLtoKinesisFirehose/PermissionsForCWL.json

iam:PassRoleは条件キーiam:PassedToServiceのことで、特定のサービスにのみロールを渡すことができるように制限が行えます。

docs.aws.amazon.com

CloudWatch Logs のサブスクリプションフィルタを作成します。

ubuntu@ip-10-0-0-183:~/CWLtoKinesisFirehose$ aws logs put-subscription-filter \
>     --log-group-name "/var/log/apache2/error.log" \
>     --filter-name "All" \
>     --filter-pattern "" \
>     --destination-arn "arn:aws:firehose:ap-northeast-1:999999999999:deliverystream/test-cwl-archive" \
>     --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisFirehoseRole"

CloudWatch のサブスクリプションに反映されました。

f:id:dafukui:20190524110931p:plain

Apacheのerrorlogを出力すると、S3にもログが転送されました。

f:id:dafukui:20190524113703p:plain

余談

ロールを設定するjsonファイルでregionを指定し忘れていたため、以下のエラーにはまってしましました。

ubuntu@ip-10-0-0-183:~/CWLtoKinesisFirehose$ aws logs put-subscription-filter \
>     --log-group-name "/var/log/apache2/error.log" \
>     --filter-name "All" \
>     --filter-pattern "" \
>     --destination-arn "arn:aws:firehose:ap-northeast-1:999999999999:deliverystream/test-cwl-archive" \
>     --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisFirehoseRole"

An error occurred (InvalidParameterException) when calling the PutSubscriptionFilter operation: Could not deliver test message to specified Firehose stream. Check if the given Firehose stream is in ACTIVE state.

Windows の awscli から実行したときはエラーになったので諦めました。

PS C:\Users\fukui> aws logs put-subscription-filter --log-group-name "/var/log/apache2/error.log" --filter-name "All" --filter-pattern "" --destination-arn "arn:aws:firehose:ap-northeast-1:999999999999:deliverystream/Test-Fukui-Applog" --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisFirehoseRole"
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
__main__.py: error: argument --filter-pattern: expected one argument
PS C:\Users\fukui>

参考

docs.aws.amazon.com

CloudWatch でアプリケーションのログを取得

環境

software version
ubuntu 18.04 LTS

CloudWatch Logs Agent の導入

CloudWatch でアプリケーションのログを取得するには、対象となるサーバに CloudWatch Logs Agent を導入する。

ubuntu@ip-10-0-0-183:~$ curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 56093  100 56093    0     0  70824      0 --:--:-- --:--:-- --:--:-- 70735
ubuntu@ip-10-0-0-183:~$
ubuntu@ip-10-0-0-183:~$
ubuntu@ip-10-0-0-183:~$ python -V
Python 2.7.15rc1
ubuntu@ip-10-0-0-183:~$
ubuntu@ip-10-0-0-183:~$ python3 -V
Python 3.6.7

python3 でインストールしようとしたら怒られた。

ubuntu@ip-10-0-0-183:~$ sudo python3 ./awslogs-agent-setup.py --region us-east-1
ERROR: This script only supports python version 2.6 - 3.5

python でインストール。

ubuntu@ip-10-0-0-183:~$ sudo python ./awslogs-agent-setup.py --region us-east-1
Launching interactive setup of CloudWatch Logs agent ...

Step 1 of 5: Installing pip ...libyaml-dev does not exist in system DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

Step 3 of 5: Configuring AWS CLI ...
AWS Access Key ID [****************LIIA]:
AWS Secret Access Key [****************pQqi]:
Default region name [us-east-1]: ap-northeast-1
Default output format [None]: json

Step 4 of 5: Configuring the CloudWatch Logs Agent ...
Path of log file to upload [/var/log/syslog]:
Destination Log Group name [/var/log/syslog]:

Choose Log Stream name:
  1. Use EC2 instance id.
  2. Use hostname.
  3. Custom.
Enter choice [1]:

Choose Log Event timestamp format:
  1. %b %d %H:%M:%S    (Dec 31 23:59:59)
  2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
  3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
  4. Custom
Enter choice [1]: 3

Choose initial position of upload:
  1. From start of file.
  2. From end of file.
Enter choice [1]:
More log files to configure? [Y]: n

Step 5 of 5: Setting up agent as a daemon ...DONE


------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region us-east-1 --only-generate-config'
------------------------------------------------------
ubuntu@ip-10-0-0-183:~$

CloudWatch Logs Agent の設定確認

/var/awslogs/etc/awslogs.confが保管先になる。

$ sudo cat /var/awslogs/etc/awslogs.conf

(途中省略)

[/var/log/syslog]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/syslog
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/syslog

errorlogを意図的に出力させたかったのでアクセスを許可しないファイルを用意。

ubuntu@ip-10-0-0-183:/var/www/html$ ll
total 20
drwxr-xr-x 2 root root  4096 May 21 14:30 ./
drwxr-xr-x 3 root root  4096 May 21 14:09 ../
-r-------- 1 root root     0 May 21 14:30 denied.html
-rw-r--r-- 1 root root 10918 May 21 14:09 index.html
ubuntu@ip-10-0-0-183:/var/www/html$

ブラウザからアクセスしてエラーが出力されることを確認。

ubuntu@ip-10-0-0-183:/var/www/html$ tail /var/log/apache2/error.log
[Tue May 21 14:09:06.072766 2019] [mpm_event:notice] [pid 25946:tid 140322336525248] AH00489: Apache/2.4.29 (Ubuntu) configured -- resuming normal operations
[Tue May 21 14:09:06.072862 2019] [core:notice] [pid 25946:tid 140322336525248] AH00094: Command line: '/usr/sbin/apache2'
[Tue May 21 14:31:34.997717 2019] [core:error] [pid 25948:tid 140322109630208] (13)Permission denied: [client 180.45.162.2:63040] AH00132: file permissions deny server access: /var/www/html/denied.html

CloudWatch Logs Agent を再起動。

ubuntu@ip-10-0-0-183:/var/www/html$ sudo systemctl restart awslogs

再度ブラウザからアクセスしてapacheのエラーを出力。 しかし、CloudWatch Logs でログが確認出来ず。

CloudWatch Logs Agent のログを確認。

ubuntu@ip-10-0-0-183:~$ sudo tail /var/log/awslogs.log

(省略)

ClientError: An error occurred (AccessDeniedException) when calling the PutLogEvents operation: User: arn:aws:iam::123456789012:user/iamuser_name is not authorized to perform: logs:PutLogEvents on resource: arn:aws:logs:ap-northeast-1:123456789012:log-group:/var/log/apache2/error.log:log-stream:i-xxxxxxxxxxxxxxxxxxx
2019-05-21 15:29:30,566 - cwlogs.push.reader - WARNING - 28881 - Thread-4 - Fall back to previous event time: {'timestamp': 1558420113000, 'start_position': 56897L, 'end_position': 56979L}, previousEventTime: 1558420113000, reason: timestamp could not be parsed from message.

検証していた環境では awscli の credentials を登録していたため、設定したEC2ロールではなく awscli の credentials 情報を使用していた様子。 awscli の credentials 情報を削除するとエラーが解消された。

CloudWatch のログメトリクスにも出力されるようになった。

f:id:dafukui:20190521155254p:plain

django + mysql メモ

環境

software version
amazon linux 2018.03
python 3.7.3
django 2.2.1
mysql 5.7

DjangoMySQLを接続するにあたって公式の推奨に従い、mysqlclientを選択する。

docs.djangoproject.com

python の設定

以下を参考に実施する。

danieleriksson.net

パッケージをダウンロードする。

$ curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz

解凍する。

$ tar -Jxvf Python-3.7.3.tar.xz

コンパイラとライブラリの導入。

[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ sudo yum groupinstall "Development Tools"

libffi-develが参考記事のコマンドには含まれていないが、必要なため追記。

$ sudo yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel libffi-devel

コンパイラが無いとビルド時にエラーになる。

[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ ./configure
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for python3.7... no
checking for python3... no
checking for python... python
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... checking for --without-gcc... no
checking for --with-icc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/home/ec2-user/Python-3.7.3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$

stackoverflow.com

ビルドする。

[ec2-user@ip-xx-xx-1-192 ~]$ cd Python-3.7.3
[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ sudo ./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ sudo make && make altinstall
[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ sudo make altinstall

python3.7 で実行できるようになる。

[ec2-user@ip-xx-xx-1-192 Python-3.7.3]$ which python3.7
/usr/local/bin/python3.7

pip3.7 も利用可能になっている。

[ec2-user@ip-xx-xx-1-192 bin]$ which pip3.7
/usr/local/bin/pip3.7

シンボリックリンク設定

python3.7 を python3 で実行できるようにしたいので、シンボリックリンクを設定する。

$ sudo ln -s /usr/local/bin/python3.7 python3
[ec2-user@ip-xx-xx-1-192 ~]$ python3
Python 3.7.3 (default, May 13 2019, 02:47:06)
[GCC 7.2.1 20170915 (Red Hat 7.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

pip3.7 も pip3 で実行できるようにする。

$ sudo ln -s /usr/local/bin/pip3.7 pip3
[ec2-user@ip-xx-xx-1-192 ~]$ pip3 list
Package    Version
---------- -------
pip        19.0.3
setuptools 40.8.0
You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

django の設定

django の導入。

$ sudo pip3 install django

プロジェクトの作成。

my_projectという名前のプロジェクトを作成することにした。

[ec2-user@ip-xx-xx-1-192 ~]$ django-admin startproject my_project

setting.pyの設定。

setting.py を編集するためディレクトリを移動する。

[ec2-user@ip-xx-xx-1-192 ~]$ cd my_project/my_project/
[ec2-user@ip-xx-xx-1-192 my_project]$ ll
total 12
-rw-r--r-- 1 ec2-user ec2-user    0 May 13 04:39 __init__.py
-rw-r--r-- 1 ec2-user ec2-user 3117 May 13 04:44 settings.py
-rw-r--r-- 1 ec2-user ec2-user  752 May 13 04:39 urls.py
-rw-r--r-- 1 ec2-user ec2-user  397 May 13 04:39 wsgi.py
[ec2-user@ip-xx-xx-1-192 my_project]$

settings.py の変更箇所は以下の通り。

ALLOWED_HOSTS = ['xxx.xxx.xxx.19']  # public ip を入力

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

mysql5.7 の設定

amazon linux のため el6 を選択する。

mysql80のリポジトリ追加

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm

mysql8.0 のリポジトリを無効化

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum-config-manager --disable mysql80-community

mysql5.7 のリポジトリを有効化

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum-config-manager --enable mysql57-community

mysql57 の情報が確認できるようになる。

[ec2-user@ip-xx-xx-1-192 my_project]$ yum info mysql-community-server
Loaded plugins: priorities, update-motd, upgrade-helper
mysql-connectors-community                                                           | 2.5 kB  00:00:00
mysql-tools-community                                                                | 2.5 kB  00:00:00
mysql57-community                                                                    | 2.5 kB  00:00:00
mysql57-community/x86_64/primary_db                                                  | 182 kB  00:00:00
24 packages excluded due to repository priority protections
Available Packages
Name        : mysql-community-server
Arch        : x86_64
Version     : 5.7.26
Release     : 1.el6
Size        : 153 M
Repo        : mysql57-community/x86_64
Summary     : A very fast and reliable SQL database server
URL         : http://www.mysql.com/
License     : Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Under GPLv2
            : license as shown in the Description field.
Description : The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,
            : and robust SQL (Structured Query Language) database server. MySQL Server
            : is intended for mission-critical, heavy-load production systems as well
            : as for embedding into mass-deployed software. MySQL is a trademark of
            : Oracle and/or its affiliates
            :
            : The MySQL software has Dual Licensing, which means you can use the MySQL
            : software free of charge under the GNU General Public License
            : (http://www.gnu.org/licenses/). You can also purchase commercial MySQL
            : licenses from Oracle and/or its affiliates if you do not wish to be bound by the terms of
            : the GPL. See the chapter "Licensing and Support" in the manual for
            : further info.
            :
            : The MySQL web site (http://www.mysql.com/) provides the latest news and
            : information about the MySQL software.  Also please see the documentation
            : and the manual for more information.
            :
            : This package includes the MySQL server binary as well as related utilities
            : to run and administer a MySQL server.

mysql-devel の導入

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum install mysql57-devel.x86_64

mysql57の導入

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum install mysql-community-server
[ec2-user@ip-xx-xx-1-192 my_project]$ mysql --version
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper
[ec2-user@ip-xx-xx-1-192 my_project]$ yum list installed | grep mysql
mysql-community-client.x86_64    5.7.26-1.el6                 @mysql57-community
mysql-community-common.x86_64    5.7.26-1.el6                 @mysql57-community
mysql-community-devel.x86_64     5.7.26-1.el6                 @mysql57-community
mysql-community-libs.x86_64      5.7.26-1.el6                 @mysql57-community
mysql80-community-release.noarch el6-3                        installed
[ec2-user@ip-xx-xx-1-192 my_project]$

mysql-devel が無いと後述する mysqlclient のインストールや django の makemigrations がエラーになる

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo pip3 install mysqlclient
Collecting mysqlclient
  Using cached https://files.pythonhosted.org/packages/f4/f1/3bb6f64ca7a429729413e6556b7ba5976df06019a5245a43d36032f1061e/mysqlclient-1.4.2.post1.tar.gz
    ERROR: Complete output from command python setup.py egg_info:
    ERROR: /bin/sh: mysql_config: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-wvc2e8ay/mysqlclient/setup.py", line 16, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-wvc2e8ay/mysqlclient/setup_posix.py", line 51, in get_config
        libs = mysql_config("libs")
      File "/tmp/pip-install-wvc2e8ay/mysqlclient/setup_posix.py", line 29, in mysql_config
        raise EnvironmentError("%s not found" % (_mysql_config_path,))
    OSError: mysql_config not found
    ----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-wvc2e8ay/mysqlclient/
[ec2-user@ip-xx-xx-1-192 my_project]$
[ec2-user@ip-xx-xx-1-192 my_project]$python3.7 manage.py makemigrations
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'

(途中省略)

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
[ec2-user@ip-xx-xx-1-192 my_project]$

参考 qiita.com

※mysql57 をインストールしてから mysql-devel をインストールしようとすると、バージョンに起因するエラーが出た。インストールした mysql をアンインストールして、mysql-devel ⇒ mysql57 の順番でインストールするとバージョンの問題を解消できた。

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo yum install mysql57-devel
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                            | 2.1 kB  00:00:00
amzn-updates                                                                         | 2.5 kB  00:00:00
24 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package mysql57-devel.x86_64 0:5.7.25-1.11.amzn1 will be installed
--> Processing Dependency: mysql57-libs(x86-64) = 5.7.25-1.11.amzn1 for package: mysql57-devel-5.7.25-1.11.amzn1.x86_64
--> Processing Dependency: mysql57(alternatives) for package: mysql57-devel-5.7.25-1.11.amzn1.x86_64
--> Processing Dependency: mysql57(alternatives) for package: mysql57-devel-5.7.25-1.11.amzn1.x86_64
--> Processing Dependency: libmysqlclient.so.1020()(64bit) for package: mysql57-devel-5.7.25-1.11.amzn1.x86_64
--> Running transaction check
---> Package mysql57.x86_64 0:5.7.25-1.11.amzn1 will be installed
--> Processing Dependency: mysql57-common(x86-64) = 5.7.25-1.11.amzn1 for package: mysql57-5.7.25-1.11.amzn1.x86_64
---> Package mysql57-libs.x86_64 0:5.7.25-1.11.amzn1 will be installed
--> Running transaction check
---> Package mysql57-common.x86_64 0:5.7.25-1.11.amzn1 will be installed
--> Processing Dependency: mysql-config for package: mysql57-common-5.7.25-1.11.amzn1.x86_64
--> Running transaction check
---> Package mysql-config.x86_64 0:5.5.62-1.23.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================
 Package                    Arch               Version                       Repository                Size
============================================================================================================
Installing:
 mysql57-devel              x86_64             5.7.25-1.11.amzn1             amzn-updates             293 k
Installing for dependencies:
 mysql-config               x86_64             5.5.62-1.23.amzn1             amzn-updates              49 k
 mysql57                    x86_64             5.7.25-1.11.amzn1             amzn-updates              14 M
 mysql57-common             x86_64             5.7.25-1.11.amzn1             amzn-updates              90 k
 mysql57-libs               x86_64             5.7.25-1.11.amzn1             amzn-updates             1.2 M

Transaction Summary
============================================================================================================
Install  1 Package (+4 Dependent packages)

Total size: 15 M
Installed size: 49 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test


Transaction check error:
  file /etc/my.cnf from install of mysql-config-5.5.62-1.23.amzn1.x86_64 conflicts with file from package mysql-community-server-5.7.26-1.el6.x86_64

Error Summary
-------------

[ec2-user@ip-xx-xx-1-192 my_project]$

mysqlclient の導入

$ sudo pip3 install mysqlclient

pypi.org

mysql57-server の導入

[ec2-user@ip-xx-xx-1-192 my_project]$ yum install mysql57-server

サービスの開始

[ec2-user@ip-xx-xx-1-192 my_project]$ sudo service mysqld start

Starting mysqld:                                           [  OK  ]

ログイン

[ec2-user@ip-xx-xx-1-192 my_project]$ mysql -u root

DB 作成

mysql> CREATE DATABASE my_project;
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_project         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql>

setting.py に以下変更を反映。

DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_project',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

マイグレーション実行

[ec2-user@ip-xx-xx-1-192 my_project]$ python3 manage.py makemigrations
[ec2-user@ip-xx-xx-1-192 my_project]$ python3 manage.py migrate

Amazon EC2 Auto Scaling 入門

Amazon EC2 Auto Scaling ってどんな機能?

耐障害性の向上のため、または可用性の向上のために、予め設定した範囲の中でEC2 インスタンスの数を増減させることができるサービス。

例えば以下のような使い方ができる。

なお、 AWS はアプリケーションの Auto Scaling (AWS Auto Scaling)も可能だが、それは本記事の EC2 Auto Scaling とは異なるものになる。

Amazon EC2 Auto Scaling を構成する要素

Amazon EC2 Auto Scaling は以下の要素で構成される。

  • グループ
  • 設定テンプレート
  • スケーリングのオプション

グループ

複数の EC2 インスタンスを論理的に1つの集まりとして管理する。
グループには EC2 インスタンスの最小数、最大数、および希望する数を指定する。

  • 最小数
    • グループの EC2 インスタンス数はこのサイズよりも小さくなることはない
  • 最大数
    • グループの EC2 インスタンス数はこのサイズよりも大きくなることはない
  • 希望数
    • グループの EC2 インスタンス数は通常この数だけ起動している
    • 今時点で必要な台数

グループ内のインスタンスに対して定期的にヘルスチェックを行い、異常のある EC2 インスタンスは終了して新たに起動する別の EC2 インスタンスと置き換えられる。
グループ内でオンデマンドインスタンスリザーブインスタンス、スポットインスタンスを併用することが可能。
インスタンスタイプは複数指定することが可能。インスタンスタイプに選択の優先度を設定して制御する。

起動テンプレート

起動するインスタンスの設定情報をテンプレートとして保存する。
再利用、共有が可能。
テンプレートはバージョン管理される。

設定情報は以下のとおり。

起動設定との違いとして、起動テンプレートは複数のバージョンのテンプレートを使用することができる

スケーリングのオプション

Amazon EC2 Auto Scaling グループをスケーリングする方法のこと。以下がある。

  • 現在のインスタンスレベルの常時維持
  • 手動スケーリング
  • スケジュールに基づくスケーリング
  • 要求に基づくスケーリング (動的スケーリング)

現在のインスタンスレベルの常時維持

ユースケース: Auto Healing

実行中のインスタンスを指定した数は常に維持するようにする。 Auto Scaling グループ内で実行中のインスタンスで定期的なヘルスチェックを実行し、インスタンスに異常があると判断すると、そのインスタンスを終了して新しいインスタンスを起動する。

  • 最大値 : 最小値=1 : 1 の場合
    常に1台を起動し、異常があれば自動で1台起動し直す
  • 最大値 : 最小値=2 : N の場合
    常に2台以上を起動。2台の片側に異常があってももう1台で維持する。

手動スケーリング

Auto Scaling グループの最大値、最小値、または希望数の変更のみを指定し、Amazon EC2 Auto Scaling が、更新された容量を維持するためにインスタンスを作成または終了するプロセスを管理する。 希望数はグループの最大値と同じかそれ以下である必要があり、希望数が最大値よりも大きい場合は最大値を更新する必要がある。

スケジュールに基づくスケーリング

インスタンスの数を増減しなければならない状況が予測でき、日付と時刻に基づいて自動的に実行されるスケーリングアクション。

  • スケジュールされたアクションの実行順序は、同じグループ内で実行される場合は維持する。複数のグループ間で実行される場合は必ずしも維持しない
  • 1 つの Auto Scaling グループあたり最大 125 のスケジュールされたアクションを作成できる
  • アクションのスケジュールを重ねることはできない。他のスケーリングアクティビティが既にスケジュールされているときにアクティビティをスケジュールしようとすると、呼び出しは拒否され、競合を知らせるエラーメッセージが表示される
  • クールダウン期間はサポートしない。

要求に基づくスケーリング (動的スケーリング)

以下の2つのポリシーがある。

  • Target tracking scaling (ターゲットの追跡スケーリングポリシー)
  • Step scaling
Target tracking scaling

需要の増減に応じてスケールする方法を定義する。 たとえば、平均 CPU 使用率が 15 分間にわたって 90% を超えると EC2 インスタンス群の拡大する等のポリシーを作成する。

Step scaling

ポリシーで指定したスケーリング調整値を使用して Auto Scaling グループの現在の容量が変更される。
メトリクスに下限と上限の閾値を設定し、その閾値を超えた割合に応じて増減させる。 スケーリング調整では、グループの容量が最大グループサイズより大きい容量にも、最小グループサイズよりも小さい容量にも変更されることはない。

スケールイン時のインスタンス削除制御

デフォルトの終了ポリシー(順序)は以下のとおり。

  1. インスタンスが最も多いAZのインスタンスを選択
  2. 候補となるインスタンスが複数ある場合、最も古い起動設定またはテンプレートを使用しているインスタンスを選択
  3. インスタンスが同じ起動設定から起動されている場合、Auto Scaling グループは次の課金時間に最も近いインスタンスを選択して終了

デフォルトの終了ポリシーはほとんどの状況に対応しているが、カスタマイズされたポリシーに置き換えることも可能。 カスタマイズしたポリシーへの置き換えは、起動するインスタンスが不均等なAZのインスタンスに適用する。均等であればすべてのAZに適用する。

AWS Config 入門

どんなサービス?

AWS リソース(モノ)の設定、変更を記録して履歴として確認できるようになる。また、AWS Config ルールを作成すれば、設定内容がルールに準拠しているか評価して、非準拠なら Amazon SNS で通知できる。
また、特定の AWS リソースを使用するすべてのリソースを確認できる。(あるセキュリティグループを使っている全てのインスタンスを確認する等)
コンプライアンス監査や、セキュリティ分析、リソース変更の追跡、トラブルシューティングを可能とする。

どうやって設定を評価するの?

AWS Config ルールを作成して評価内容を定義する。
AWS Config ルールにはマネージドルールというカスタマイズ可能な定義済みのルールが用意されているが、独自のカスタムルールを作成することもできる。 AWS Config はリソースで発生する設定変更を継続的に追跡し、これらの変更がルールの条件に違反している場合はリソースとルールに非準拠を示す [noncompliant] のフラグを付ける。

評価の対象にできるリソースは以下の3つ。

  • タグキー
  • リソースタイプ
  • リソースID

評価のトリガーは以下の2種類。

  • 設定変更
    • ルールの範囲に該当するリソースで設定が変更されたとき (設定レコーダーが有効のとき)
  • 定期的
    • 指定した間隔 (選択可能な頻度は 1 時間、3 時間、6 時間、12 時間、24 時間)

サービスの開始方法

コンソールおよび AWS CLI で開始可能。 アカウント内のリージョン単位で操作が必要。

ルールの有効化方法

  • マネージドルール
  • カスタムルール
    • Lambda 関数を作成する

標準で最大 150 個のルールを作成できる。

利用するメリットは?

  • 初期費用なしでリソースの設定を簡単に追跡できる。
  • データ収集のためのエージェントをインストールおよび更新したり、大規模なデータベースを管理したりといった複雑な作業を回避できる。
  • 特定の規準 (PCI-DSS、HIPAA など) に準拠させる必要があるワークロードを持っている場合は、Config ルールの機能を使用して AWS インフラストラクチャ設定のコンプライアンスを評価し、監査人に向けてレポートを生成できる。

マルチアカウント、マルチリージョンでのデータ集約について

AWS Config のデータ集約機能では、複数のアカウントやリージョンの AWS Config データを単一のアカウントに集約できる。これは純粋に、コンプライアンスの可視性を実現するレポート機能である。
AWS Config の新しいリソースタイプであるアグリゲータで複数のアカウントやリージョンから AWS Config データを収集する。
AWS Organizations は利用していなくても良い。

EC2 インスタンス内のソフトウェアに対する設定変更について

AWS アカウント内の EC2 インスタンス内に加え、オンプレミス環境の仮想マシン (VM) やサーバー内のソフトウェアに対する設定変更を記録できます。

以前にコンプライアンス違反であったリソースが依然としてコンプライアンス違反である場合の挙動

AWS Config は、コンプライアンス状況に変化があったときにのみ通知を送信します。以前にコンプライアンス違反であったリソースが依然としてコンプライアンス違反である場合、Config は新しい通知を送信しません。コンプライアンス状況が「コンプライアンス遵守」に変化した場合、状況変化の通知がお客様に届きます。

AWS Config を使って S3 バケットのパブリックアクセスが可能となった場合に通知する方法

aws.amazon.com

できないこと

  • リソースをプロビジョニングする前、またはリソースの設定を変更する前にルールによる評価を実行すること
  • データ集約機能を使って複数アカウントにルールをプロビジョニングすること

課金のタイミング

  • 記録対象のリソースタイプで変更を検出した回数
  • 月ごとにアクティブだった AWS Config ルールの数

AWS Organizations 入門

AWS Organizations とは

複数の AWS アカウントを統合するためのアカウント管理サービス。

実現できること

  • AWS アカウントのグループを作成し、作成したグループにポリシーを適用して、利用サービスを制限できる
  • AWS アカウントの新規作成は自動化できる
  • 複数の AWS アカウントの請求を一括して、請求を簡素化できる

AWS Organizations の構成

https://image.slidesharecdn.com/20180214aws-blackbelt-organizations-180220120529/95/20180214-aws-black-belt-online-seminar-aws-organizations-7-638.jpg?cb=1519128494

  • 管理者として使用するAWSアカウントを一つ選び、組織を作る。
  • 選んだAWSアカウントはマスターアカウントとなり、組織の全体を管理する権限を持つ。
  • 組織内のマスターアカウント以外はメンバーアカウントとなる
  • 組織には複数AWSアカウントのグループ(OU)を作成できる。
  • OUにはAWSアカウントを作成、追加することができる。
  • OUからアカウントを削除した場合、アカウントは組織からは外れるが独立したたアカウントとなり、個別に請求などが開始される。アカウント自体が消されるわけではなく、使い続けれる。
  • OUの開始点は管理用ルートとなる。
  • 組織内の権限はポリシーで制御することができる。
  • サービスコトロールポリシー(SCP)はIAMと同じ構文ルールで登録する

一括請求(Consolidated Billing)について

利用シーン

  • AWSの支払いを代行してほしい

    • AWS Organizationsで作成したアカウントを提供するか、既存のアカウントを組織に招待して統合します
    • 代行者はマスターアカウントで利用料を支払い、費用を請求します
  • プロジェクトの環境を本番、ステージング、開発の3つに分けて管理したいんだけど

    • AWS Organizationsでそれぞれの環境用のアカウントを作成しましょう
  • 社員にAWSの検証環境を配布したい

    • マスターアカウントにしたいAWSアカウントで組織を作成しましょう
    • AWS Organizationsでそアカウントを作成して提供しましょう
  • 組織からアカウントを削除したら使えなくなる?

    • アカウント自体は削除されないので大丈夫です
    • アカウントが独立するので個別に請求されないように注意

参考

www.slideshare.net