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に送る
以下記事の続き。
今回は以下のイメージで、EC2で稼働するApacheのログデータをS3に保管したいと思います。
Kinesis Firehose の設定
WEBコンソールで設定します。
Firehose
の配信ストリームの作成に進む。
送信されるデータは標準で圧縮処理が行われているため、Firehose側での対応は不要です。
CloudWatch Logs から Amazon Kinesis Data Firehose に送信されたデータは、すでに gzip レベル 6 圧縮で圧縮されているため、Kinesis Data Firehose 配信ストリーム内で圧縮を使用する必要はありません。
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"] } ] }
今回は以下のような構造にしました。
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
のことで、特定のサービスにのみロールを渡すことができるように制限が行えます。
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 のサブスクリプション
に反映されました。
Apacheのerrorlogを出力すると、S3にもログが転送されました。
余談
ロールを設定する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>
参考
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 のログメトリクスにも出力されるようになった。
django + mysql メモ
環境
software | version |
---|---|
amazon linux | 2018.03 |
python | 3.7.3 |
django | 2.2.1 |
mysql | 5.7 |
DjangoとMySQLを接続するにあたって公式の推奨に従い、mysqlclient
を選択する。
python の設定
以下を参考に実施する。
パッケージをダウンロードする。
$ 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]$
ビルドする。
[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 の設定
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
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 グループの現在の容量が変更される。
メトリクスに下限と上限の閾値を設定し、その閾値を超えた割合に応じて増減させる。
スケーリング調整では、グループの容量が最大グループサイズより大きい容量にも、最小グループサイズよりも小さい容量にも変更されることはない。
スケールイン時のインスタンス削除制御
デフォルトの終了ポリシー(順序)は以下のとおり。
- インスタンスが最も多いAZのインスタンスを選択
- 候補となるインスタンスが複数ある場合、最も古い起動設定またはテンプレートを使用しているインスタンスを選択
- インスタンスが同じ起動設定から起動されている場合、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 で開始可能。 アカウント内のリージョン単位で操作が必要。
ルールの有効化方法
標準で最大 150 個のルールを作成できる。
利用するメリットは?
- 初期費用なしでリソースの設定を簡単に追跡できる。
- データ収集のためのエージェントをインストールおよび更新したり、大規模なデータベースを管理したりといった複雑な作業を回避できる。
- 特定の規準 (PCI-DSS、HIPAA など) に準拠させる必要があるワークロードを持っている場合は、Config ルールの機能を使用して AWS インフラストラクチャ設定のコンプライアンスを評価し、監査人に向けてレポートを生成できる。
マルチアカウント、マルチリージョンでのデータ集約について
AWS Config のデータ集約機能では、複数のアカウントやリージョンの AWS Config データを単一のアカウントに集約できる。これは純粋に、コンプライアンスの可視性を実現するレポート機能である。
AWS Config の新しいリソースタイプであるアグリゲータで複数のアカウントやリージョンから AWS Config データを収集する。
AWS Organizations は利用していなくても良い。
EC2 インスタンス内のソフトウェアに対する設定変更について
AWS アカウント内の EC2 インスタンス内に加え、オンプレミス環境の仮想マシン (VM) やサーバー内のソフトウェアに対する設定変更を記録できます。
- AWS Config で記録される設定情報
- オペレーティングシステム更新
- ネットワーク設定
- インストール済みのアプリケーション
以前にコンプライアンス違反であったリソースが依然としてコンプライアンス違反である場合の挙動
AWS Config は、コンプライアンス状況に変化があったときにのみ通知を送信します。以前にコンプライアンス違反であったリソースが依然としてコンプライアンス違反である場合、Config は新しい通知を送信しません。コンプライアンス状況が「コンプライアンス遵守」に変化した場合、状況変化の通知がお客様に届きます。
AWS Config を使って S3 バケットのパブリックアクセスが可能となった場合に通知する方法
できないこと
- リソースをプロビジョニングする前、またはリソースの設定を変更する前にルールによる評価を実行すること
- データ集約機能を使って複数アカウントにルールをプロビジョニングすること
課金のタイミング
- 記録対象のリソースタイプで変更を検出した回数
- 月ごとにアクティブだった AWS Config ルールの数
AWS Organizations 入門
AWS Organizations とは
複数の AWS アカウントを統合するためのアカウント管理サービス。
実現できること
- AWS アカウントのグループを作成し、作成したグループにポリシーを適用して、利用サービスを制限できる
- AWS アカウントの新規作成は自動化できる
- 複数の AWS アカウントの請求を一括して、請求を簡素化できる
AWS Organizations の構成
- 管理者として使用するAWSアカウントを一つ選び、組織を作る。
- 選んだAWSアカウントはマスターアカウントとなり、組織の全体を管理する権限を持つ。
- 組織内のマスターアカウント以外はメンバーアカウントとなる
- 組織には複数AWSアカウントのグループ(OU)を作成できる。
- OUにはAWSアカウントを作成、追加することができる。
- OUからアカウントを削除した場合、アカウントは組織からは外れるが独立したたアカウントとなり、個別に請求などが開始される。アカウント自体が消されるわけではなく、使い続けれる。
- OUの開始点は管理用ルートとなる。
- 組織内の権限はポリシーで制御することができる。
- サービスコントロールポリシー(SCP)はIAMと同じ構文ルールで登録する
一括請求(Consolidated Billing)について
- ボリュームディスカウントが合算して計算される
- リザーブドインスタンスによる割引がデフォルトで共有(共有しないように設定も可能)
- 各アカウントの請求額は確認可能。リザーブドインスタンスによる割引が共有された状態での請求額となるが、使用状況レポートでは割引を共有しない場合の料金(Unblended Rate)も確認可能。
利用シーン
AWSの支払いを代行してほしい
- AWS Organizationsで作成したアカウントを提供するか、既存のアカウントを組織に招待して統合します
- 代行者はマスターアカウントで利用料を支払い、費用を請求します
プロジェクトの環境を本番、ステージング、開発の3つに分けて管理したいんだけど
- AWS Organizationsでそれぞれの環境用のアカウントを作成しましょう
社員にAWSの検証環境を配布したい
組織からアカウントを削除したら使えなくなる?
- アカウント自体は削除されないので大丈夫です
- アカウントが独立するので個別に請求されないように注意
参考
www.slideshare.net