- 投稿日:2020-05-24T18:30:41+09:00
Django+MySQLのアプリケーションをAWSのElastic Beanstalkにデプロイする (UTokyo Project Sprint 用)
UTokyo Project Sprint 用の記事です。主に、Django Sprint で構築した方を想定して書かれています。
この記事では EB CLI は使用せずに、コンソールからデプロイします。
また、この記事の内容は一例で、もちろんアプリ内で使用するフレームワークや、ライブラリによって異なりますので、適宜自分のプロジェクトに対応させてください。目次
requirements.txt
の修正- Elastic Beanstalkのアプリケーションと環境を作成する
- データベースの設定を行う
- アプリケーションソースバンドルを準備する
- アプリケーションソースバンドルを作成する
0.
requirements.txt
の修正
requirements.txt
のDjango
とmysqlclient
のバージョンを以下のように書き換えてください。requirements.txt... Django>=2.1,<2.2 mysqlclient==1.3.12 ...1. Elastic Beanstalkのアプリケーションと環境を作成する
AWS マネジメントコンソール にログインしてください。
ただし、AWS Educate のアカウントからの場合はこの記事を参考にしてください。Elastic Beanstalk を選び、Create Application からアプリケーションを作成します。
- アプリケーション情報 > アプリケーション名 : 自身のアプリ名
- アプリケーションタグ : 任意。
- プラットフォーム : 今回は、プラットフォーム は
Python
、プラットフォームのブランチ はPython 3.6 running on 64bit Amazon Linux
、プラットフォームのバージョン は2.9.10
を選択しました。- アプリケーションコード : とりあえず「サンプルアプリケーション」を選んでおきます。あとから自分のソースをアップロードします。
[アプリケーションの作成] を押します。あとは自動で環境まで作成してくれるので数分待っておきます。
無事終了したら、その環境のダッシュボードのような画面になると思います。左のメニューの、「環境に移動する」をクリックするとサンプルアプリケーションの画面が出てきます。
出てきたURLのhttp://
などの部分を除くXXX.YYY.ZZZ.elasticbeanstalk.com
が自身のアプリのドメインになります。
あとでこれを使うので控えておいてください。2. データベースの設定を行う
左のメニューから 設定 を選びます。一番下の データベース の右の 編集 ボタンを押します。
データベース設定 の各欄について以下の選択をします。Amazon RDS DB に作成されます。
- エンジン :
mysql
- エンジンバージョン :
5.7.22
を選択- インスタンスクラス :
db.t2.micro
を選択- ストレージ :
5
- ユーザー名 : 各自作成して(一応)覚えておいてください。
- パスワード : 各自作成して(一応)覚えておいてください。
- 保持期間 :
スナップショットの作成
- アベイラビリティー :
低(1つのAZ)
[適用] を押してください。変更が反映されるまで待っておいてください。
3. アプリケーションソースバンドルを準備する
ここから主にローカルでの作業に移ります。以下、
cms
というアプリを作成している前提で進めているで、適宜自分のアプリ名に置き換えてください。
最初に、このセクションをすべて終えたときに出来上がるディレクトリ構造の一例を以下に示します。適宜参考にしてください。├─ .ebextensions # Added │ └─ python.config # Added ├─ requirements.txt ├─ manage.py # Updated ├─ cms │ ├─ management # Added │ | ├─ commands # Added | | | ├─ createsu.py # Added | | | └─ __init__.py # Added | | └─ __init__.py # Added │ ├─ templates | ︙ │ └─ views.py ├─ config │ ├─ __init__.py │ ├─ settings # Added (settings.py removed) | | ├─ common.py # Added | | ├─ local.py # Added | | └─ production.py # Added │ ├─ urls.py │ └─ wsgi.py # Updated ├─ docker-compose.yml └─ Dockerfile3-1.
.ebextensions
ディレクトリを作成するElastic Beanstalk にデプロイする際に必要となるディレクトリです。
プロジェクトのディレクトリ直下に.ebextensions
ディレクトリを作成し、その中にpython.config
というファイルを作成してください。そのファイルに、以下を書き込んでください。一例なので、適宜書き換えてください。なお、このファイルのインデントはtabだとエラーが出るので必ずspaceを使用してください。(コピペするとtabになると思うので、spaceに直してください。)
.ebextensions/python.configcontainer_commands: 01_migrate: command: 'python manage.py migrate' leader_only: true 02_collectstatic: command: 'python manage.py collectstatic --noinput' 03_createsu: command: 'python manage.py createsu' leader_only: true option_settings: 'aws:elasticbeanstalk:application:environment': DJANGO_SETTINGS_MODULE: 'config.settings.production' PYTHONPATH: '$PYTHONPATH' 'aws:elasticbeanstalk:container:python': StaticFiles: '/static/=www/static/' WSGIPath: 'config/wsgi.py'以下、上記の内容の解説です。
3-1-1.
container_commands
01_migrate
ではマイグレーション
02_collectstatic
静的ファイルの処理
03_createsu
スーパーユーザーの作成
のコマンドを実行しています。なお、03_createsu
のpython manage.py createsu
については後述します。3-1-2.
option_settings
DJANGO_SETTINGS_MODULE
の部分で、後ほど作成する、production.py
を読み込むように環境変数を設定しています。
WSGIPath
やStaticFiles
などについては、コンソールの設定のところでも変更可能です。
option_settings
について詳しく知りたい方は、以下を参照してください。3-2.
settings.py
を分割する次に、
/config/settings.py
を、開発用(Local)と本番用(Production)に分割します。
/config/settings.py
は、Local 環境と Production 環境で別々のものを読み込む必要があるのですが、毎回書き換えていると大変なので、自動で切り替わるようにします。
具体的には、
1.common.py
に Local 環境と Production 環境で共通の設定項目を書き込む
2.local.py
は、common.py
の内容に加えて、Local 環境固有の設定項目を書き込む
3.production.py
は、common.py
の内容に加えて、Production 環境固有の設定項目を書き込む
4.manage.py
とwsgi.py
を修正するどちらの環境にも共通している設定項目は、
common.py
に書き込みます。個別に設定すべき内容
Local 環境と Production 環境でそれぞれ固有の設定は例えば以下のようなものです。
DEBUG
DATABASE
ALLOWED_HOSTS
MEDIA_ROOT
STATIC_ROOT
LOGGING
ただし、
common.py
に書いている設定項目に、local.py
やproduction.py
で追加したい場合は、例えば以下のようにします。(配列に追加)INSTALLED_APPS += ( 'django.contrib.admin', )3-2-1.
common.py
,local.py
,production.py
を作成するまず、
/config
直下に、settings
というディレクトリを作成し、その中に/config
下のsettings.py
を移動させ、common.py
にリネームしてください。
また、/config/settings
ディレクトリの中にlocal.py
,production.py
の2つのファイルを新規に作成してください。
以下のようなディレクトリ構造になっていることを確認してください。... ├─ config │ ├─ settings # Added | | ├─ common.py # Added (settings.py をリネームしたもの) | | ├─ local.py # Added | | └─ production.py # Added ...3-2-2.
BASE_DIR
を修正する
common.py
の最初のほうにあるBASE_DIR
を以下のように変更してください。/config/settings/common.py... BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ...↓
/config/settings/common.py... BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) ...3-2-3.
local.py
にLocal 環境固有の設定を書き込む
local.py
に、common.py
の内容に加えて、Local 環境で固有の設定項目を書き込みます。
common.py
の内容を以下のようにimportします。/config/settings/local.pyfrom .common import *あとは、個別に設定すべき内容 を書けばよいだけです。
これを踏まえると、local.py
は例えば以下のようになります。
これはローカルでPostgreSQLを使っていた場合なのですが、各自ローカルで使っていたDBの設定をそのまま移していただいて結構です。/config/settings/local.pyfrom .common import * DEBUG = True ALLOWED_HOSTS = [ '0.0.0.0', '127.0.0.1', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, 'PASSWORD': 'somepassword', } }3-2-3.
production.py
にProduction 環境固有の設定を書き込む
production.py
に、common.py
の内容に加えて、Production 環境で固有の設定項目を書き込みます。
local.py
と同様に、common.py
の内容を以下のようにimportします。/config/settings/production.pyfrom .common import *あとは、個別に設定すべき内容 を書けばよいだけです。以下の項目は一例です。自身の環境に合わせて、適宜対応してください。
3-2-3-1.
DEBUG
Production 環境では、
DEBUG
をFALSE
にします。/config/settings/production.py... DEBUG = False3-2-3-2.
ALLOWED_HOSTS
ALLOWED_HOSTS
に自身のアプリのドメインを追加します。ただし、XXX.YYY.ZZZ.elasticbeanstalk.com
の部分は1で確認した自分のアプリのドメインに置き換えてください。/config/settings/production.py... ALLOWED_HOSTS = [ 'XXX.YYY.ZZZ.elasticbeanstalk.com', ]3-2-3-3.
DATABASES
DATABASES
を、本番環境のRDS
のものに書き換えます。'RDS_~'
という変数を使えば、Elastic Beanstalk のほうで勝手に書き換えてくれます。
'ENGINE'
がlocal.py
とは変わっていることに注意してください。/config/settings/production.py... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], } }3-2-3-4.
STATIC_ROOT
STATIC_ROOT
を追加します。/config/settings/production.py... STATIC_ROOT = os.path.join(BASE_DIR, 'www', 'static')以上を踏まえると、全体として
production.py
は例えば以下のようになります。ただし、XXX.YYY.ZZZ.elasticbeanstalk.com
の部分は1で確認した自分のアプリのドメインに置き換えてください。/config/settings/production.pyfrom .common import * DEBUG = False ALLOWED_HOSTS = [ 'XXX.YYY.ZZZ.elasticbeanstalk.com', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], } } STATIC_ROOT = os.path.join(BASE_DIR, 'www', 'static')3-2-5.
common.py
を修正する
common.py
の、Local 環境とProduction 環境に 個別に設定すべき内容 の項目とその値(中身)をすべて削除してください。
例えば今回であれば、DEBUG
、ALLOWED_HOSTS
、DATABASES
などが該当します。3-2-6.
common.py
にSTATIC_URL
を追加する
common.py
に以下を追記します。すでにある場合は飛ばして構いません。/config/settings/common.py... STATIC_URL = '/static/' ...なお、Djangoの静的ファイルの扱いについては、この記事がとても分かりやすいので、是非読んでみてください。
3-2-7.
manage.py
とwsgi.py
を修正するルート直下の
manage.py
と、/config
直下のwsgi.py
の以下の部分を修正します。... os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings") ...↓
manage.pyos.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")/config/wsgi.py... os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production") ...3-3. スーパーユーザー作成用のコマンドを準備する
最後に、スーパーユーザー作成用のファイルを作成していきます。スーパーユーザーの作成は、Local 環境であれば、
$ python manage.py createsuperuserなどとして、ユーザー名、メールアドレス、パスワードを入力したと思いますが、今回はサーバーに実行してもらうため、それらを手動で入力することができません。なので、事前に入力する値を設定しておいて、それを実行させます。それが前述の 3-1-2 で出てきたものです。
3-3-1.
createsu.py
を作成する
cms
(アプリ名なので置き換えてください。)の下にmanagement
フォルダ、その下にcommands
フォルダを作成し、そこにcreatesu.py
を作成してください。そのファイルに以下を書き込んでください。8行目の
XXX
、9行目のXXX
、YYY
、ZZZ
は各自で書き換えて、どこかに控えておいてください。また、8行目のXXX
と 9行目のXXX
は一致させてください。
これがスーパーユーザーアカウントになります。複数作りたい場合は、if
文の数を増やせばよいだけです。cms/management/commands/createsu.pyfrom django.core.management.base import BaseCommand, CommandError from django.contrib.auth import get_user_model User = get_user_model() class Command(BaseCommand): def handle(self, *args, **options): if not User.objects.filter(username="XXX").exists(): User.objects.create_superuser(username="XXX", email="YYY", password="ZZZ") self.stdout.write(self.style.SUCCESS('Successfully created new super user'))3-3-2.
__init__.py
を作成する次に、作成した
management
,commands
フォルダそれぞれの直下に__init__.py
というファイルを作成してください。これらのファイルは作成するだけで、中身は何も書き込みません。これで「アプリケーションソースバンドルの準備」は完了です。このセクションの最初にお見せした、ディレクトリ構造と同じようになっているかどうかを確認してください!
4. アプリケーションソースバンドルを作成する
あとは、作成したものを
zip
にして、デプロイするだけです。4-1.
zip
ファイルを作成する何も難しいことはないかと思いますが、
zip
にする対象について。
基本的にプロジェクト直下のファイル、フォルダをまとめてzip
にします。(プロジェクトのディレクトリそのものをzip
にするわけではない)
ただし、例えばgit
を使っているのなら、.git
フォルダや、.gitignore
などのファイルがあると思いますが、それらは含めません。アプリケーションに必要なものだけを対象にしてください。
必要であれば以下を参照してくださいMac, Linux の場合
例えばプロジェクトのルートディレクトリで、以下のようなを実行すれば、プロジェクトの一つ上の階層に
myapp.zip
が生成されます。(.
から始まるものは、.ebextensions
しか含まれないので、ほかに含める必要のあるファイルやフォルダがあれば適宜対応してください。)$ zip ../myapp.zip -r * .ebextensionsWindowsの場合
コマンドプロンプトやPowershellからもできますが、コマンドが長すぎるのと、含めないファイル(フォルダ)の設定がややこしいのでGUIでやります。以下のように、必要なファイルとフォルダを選択して、
右クリック→送る→圧縮(zip形式)フォルダー
とすれば作成できます。4-2. アップロードしてデプロイする
いよいよ、サーバーにアップロードしてデプロイします。
コンソールの実行バージョンの下の、「アップロードとデプロイ」をクリックして、先ほど作成したzip
ファイルを選択します。
バージョンラベルは自分でバージョンを区別できるわかりやすいものを付けると良いでしょう。あとは、「デプロイ」ボタンを押して完了です。
最初のデプロイは完了までに数分かかることがあるので辛抱強く待ってください。エラーが出ていなければデプロイ完了です。自身のアプリのURLにアクセスして、スーパーユーザーアカウントにログインできるか、などを確認してみましょう。
以上です。お疲れさまでした。
参考
- データベースを Elastic Beanstalk 環境に追加する
- Python アプリケーション環境に Amazon RDS DB インスタンスを追加
- アプリケーションソースバンドルを作成する
- Tutorial: Deploying Python 3, Django, PostgreSQL to AWS Elastic Beanstalk
- Deploying Django + Python 3 + PostgreSQL to AWS Elastic Beanstalk
- [Django] プロジェクト構成のベストプラクティスを探る - 2.設定ファイルを本番用と開発用に分割する
- Elastic Beanstalk Python プラットフォームを使用する
- Djangoにおける静的ファイル(static file)の取り扱い
- 投稿日:2020-05-24T18:00:10+09:00
Eclipseを使ってJavaからMySQLへ接続する
JavaでMySQLを操作する方法について解説していきます。
今回はWindows環境にXAMPPをインストールしてMySQLを使用します。事前準備
・JDKのインストール
・Eclipseのインストール
・XAMPPのインストール
・JDBCドライバの準備Eclipseの準備
1.Javaプロジェクトを作成
左上の「ファイル(F)」>「新規(N)」>「Javaプロジェクト」 で今回使う新規プロジェクトを作成します。
プロジェクト名はわかりやすく「MysqlTest」とでもしておきましょう。「完了(F)」をクリックして作成します。2.プロジェクトにJDBCドライバを組み込む
プロジェクトが作成できたらプロジェクト上で右クリックをし、 「ビルド・パス(B)」>「外部アーカイブの追加(V)…」を選択してJDBCドライバ(mysql-connector-java-8.0.19.jar)を開きます。
プロジェクト直下の「参照ライブラリ」にmysql-connector-java-8.0.19.jarが追加してあれば大丈夫です。MySQLの準備
XAMPPを起動し、MySQLを「Start」させます。
Startできたら右にある「Shell」をクリックして起動させます。
起動出来たら以下のコマンドを入力し、rootユーザーでMySQLに接続します。パスワード等の設定はこちらの記事を参考にしてください。mysql -u root -p接続ができたら、以下のコマンドでデータベースを作成します。今回は「test_db」という名前のデータベースを作成します。
CREATE DATABASE test_db;無事に作成できたら、以下のコマンドで今作ったデータベースに接続します。
USE test_db;次にテーブルを作成し、データを格納していきます。今回は「test」というテーブルを作成します。以下のコマンドを入力してください。※コンマを忘れないように!もし、入力ミスをした場合は「\c」で中断して新しく入力し直してください。
CREATE TABLE test( id VARCHAR(3), name VARCHAR(10) );テーブルが作成できたらデータを格納していきます。今回はデータを3行格納してみましょう。
INSERT INTO test VALUES('001', 'みかん'); INSERT INTO test VALUES('002', 'りんご'); INSERT INTO test VALUES('003', 'ぶどう');きちんとデータが格納されたかどうか以下のコマンドで確認してみましょう。
SELECT * FROM test;JavaからMySQLに接続
さて、以上で準備は整いました。ここからはJavaプログラムを作成して、先ほど作成したデータベースにアクセスし、テーブルのデータを表示させてみましょう。
まず、最初に作った「MysqlTest」プロジェクトの中にある「src」を右クリックし、「新規(W)」>「パッケージ」で「java_mysql」というパッケージを作成します。
次に、今作ったパッケージを右クリックし、「新規(W)」> 「ファイル」で「Test.java」というファイルを作成します。
ここまで出来たら「Test.java」の中身を書いていきます。 コードの意味はコメントで書いておきました。Test.javapackage java_mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Test { public static void main(String[] args) { // 変数の準備 Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; // SQL文の作成 String sql = "SELECT * FROM test"; try { // JDBCドライバのロード Class.forName("com.mysql.cj.jdbc.Driver"); // データベース接続 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?serverTimezone=JST", "root", "root"); // SQL実行準備 stmt = con.prepareStatement(sql); // 実行結果取得 rs = stmt.executeQuery(); // データがなくなるまで(rs.next()がfalseになるまで)繰り返す while (rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); System.out.println(id + ":" + name); } } catch (ClassNotFoundException e) { System.out.println("JDBCドライバのロードでエラーが発生しました"); } catch (SQLException e) { System.out.println("データベースへのアクセスでエラーが発生しました。"); } finally { try { if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("データベースへのアクセスでエラーが発生しました。"); } } } }コードが書き終わったら保存をし、「Test.java」を右クリックして「実行(R)」>「Javaアプリケーション」から実行します。
- 投稿日:2020-05-24T17:56:42+09:00
DockerでMySQLなどのテスト環境を作っていたら(errno: 150 "Foreign key constraint is incorrectly formed")が出た話
背景
mariadbをdocker環境に移してテストしようとしたところ、30分くらい詰まってしまったのでここに供養します。
現象
外部参照用のテーブルを新規に作成しようとすると下記のエラーが出る。
ERROR 1005 (HY000): Can't create table `{dbname}`.`{tablename}` (errno: 150 "Foreign key constraint is incorrectly formed")原因(1)
参照しようとしている行がユニークでないためエラーになっていた。
下記のようなSQLで、重複データを削除し プレマリキーとした。CREATE TEMPORARY TABLE {table name}_tmp AS SELECT id,MIN(uid),MIN(name) FROM tweets GROUP BY id; DELETE FROM {table name}; INSERT INTO {table name} SELECT * FROM {table name}_tmp; DROP TABLE {table name}_tmp; ALTER TABLE {table name} ADD PRIMARY KEY (id);原因(2)
参照先と参照元の型が異なる場合に発生する。
同一の方であることを確認した。原因(3)
テーブルのcharsetが異なる場合に発生する。
下記のコマンドで確認する。SHOW CREATE TABLE {table name};とりあえず、対象テーブルを同一なcharsetに修正する。
※データが入っていると色々面倒ですが、私は何も入っていないのですんなり行きました。ALTER TABLE {table name} CONVERT TO CHARACTER SET {char set};あと、外部参照がある、テーブルにも設定させる
create table{table name}( {col} varchar(23) not NULL, ... )ENGINE=InnoDB DEFAULT CHARSET={char set};最後に
私は1と3で発生していました。
備忘録です、忘れぬように ここに刻む
- 投稿日:2020-05-24T16:06:39+09:00
MySQLのコンテナを作る方法
- 環境
- CentOS Linux release 7.8.2003 (Core)
- Docker Engine 19.03.8
- docker-compose version 1.25.5
1. docker-compose.ymlを作る
version: '3.8' services: app: ...省略... logdb: image: mysql:8.0.20 environment: MYSQL_DATABASE: logdb MYSQL_USER: log MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password MYSQL_TCP_PORT: 3306 ports: - 3304:3306 volumes: - ./logdb/my.cnf:/etc/mysql/conf.d/my.cnf - ./logdb/init:/docker-entrypoint-initdb.d container_name: logdb restart: always
image
にはDockerHubにあるMySQLを指定指定のやり方はいくつかあるようだが、後でバージョンがわかる書き方にしてみた。
mysql - Docker Hub
environment
にデータベースの情報を指定
MYSQL_DATABASE
: 初期作成するデータベース名を指定MYSQL_USER
MYSQL_PASSWORD
:MYSQL_DATABASE
で指定したデータベースのスーパーユーザーになるユーザーとそのパスワードを指定MYSQL_ROOT_PASSWORD
: rootユーザーのパスワードを指定MYSQL_TCP_PORT
: MySQLのポート番号を指定
- 指定しなくても3306になりそうだけれど自信がないので指定しておく
ports
に公開するポートを指定ほかのコンテナやホストの外部からデータベースを使えるように
{ホストでのポート}:{コンテナでのポート}
を指定
volumes
の指定設定ファイルの配置
文字コードなどの必要な設定を記載した設定ファイル
my.cnf
を用意しておき/etc/mysql/conf.d
に配置するmy.cnf[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci init-connect='SET NAMES utf8mb4' skip-character-set-client-handshake port=3306 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysqldump] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4初期テーブル作成用SQLの配置
最初に作成しておいてほしいテーブル定義を書いたSQLを
init
ディレクトリに格納しておきdocker-entrypoint-initdb.d
に配置するとデータベース作成後に作成しておいてもらえる
データを作成しておきたい場合もSQLをディレクトリに入れておけば実行してもらえるUSE logdb; DROP TABLE IF EXISTS rhel6; CREATE TABLE rhel6 ( -- ...省略... ); DROP TABLE IF EXISTS rhel7; CREATE TABLE rhel7 ( -- ...省略... );
restart
でコンテナの自動起動を設定
always
(常に再起動)を設定することでホストを起動したときに自動で起動してもらえる2. コンテナを作る
--no-recreate
をつけて既存のコンテナを作り直さないようにしてコンテナを作成する$ docker-compose up -d --no-recreate --build ...省略... Creating logdb ... done $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 625ce72a719 mysql:8.0.20 "docker-entry…" 23 seconds ago Up 21 seconds 33060/tcp, 0.0.0.0:3304->3306/tcp logdb 5cead7ffb9b host-java... "/usr/sbin/init" 7 hours ago Up 28 minutes 0.0.0.0:18080->8080/tcp app3. データベースにログインしてみる
ホストからログイン
ホストからつなぐときは、[コンテナに入る] > [データベースにログイン]でちょっと面倒くさい
けれどホストからつなぐことはあまりない・・・と思う# 1.コンテナに入る $ docker exec -it logdb bash # 2. データベースにログイン root@793f7ed80b16:/# mysql -u log -D logdb -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.20 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. # my.cnfの設定が使われてるっぽい mysql> select default_character_set_name, default_collation_name from information_schema.schemata where schema_name = 'logdb'; +----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+ 1 row in set (0.00 sec) # テーブルもできている mysql> show tables; +-----------------+ | Tables_in_logdb | +-----------------+ | rhel6 | | rhel7 | +-----------------+ 2 rows in set (0.00 sec) mysql>アプリ用コンテナからログイン
ほかのコンテナからログインするときは
-h
(ホスト)に「コンテナ名」を指定する$ mysql -h logdb -u log -D logdb -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.20 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>ローカルPC(Windows)のGitBashでログイン
ホスト外部からログインするときは
-h
(ホスト)に「ホストのIPアドレス」を-P
(ポート)に「docker-compose.ymlで指定したホストのポート」を指定する
winpty
はGitBashを使用しているからつけているだけなので普通はいらない$ winpty mysql -h {ホストのパブリックIP} -P 3304 -u log -D logdb -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14 Server version: 8.0.20 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
- 投稿日:2020-05-24T15:08:09+09:00
DockerでMySQLを起動して、Intelij IDEAで接続する方法
DockerでMySQLを起動して、Intelij IDEAにdockerプラグインを導入して接続する方法を紹介します。画像多めです。
作業環境
OS:Windows 10
エディション:HOME
バージョン:2004事前準備
①Windowsを最新版にアップデートする
下記のサイトを参考に、Windows 10 HOMEの場合は必ず最新版までアップデートしておきます。
https://www.atmarkit.co.jp/ait/articles/1701/07/news037.html
最新版になるまで、何回もやる可能性があります。下のような画面になれば、OKです。
②IntelliJ IDEAのインストールする
以下のサイトを参考にIntelliJ IDEAの Community Edition をインストールし、日本語化します。
https://sukkiri.jp/technologies/ides/intellij-idea/intellij-idea-win.html
※Editionが2つあるので、注意してください。
③Dockerをインストールする
以下のサイトを参考に、Dockerをインストールします。
https://techracho.bpsinc.jp/ebi/2020_03_27/90477Windows 10 HOMEの場合は、インストール方法が特殊なので、下記のサイトを参考にインストールしてください。
https://tech.guitarrapc.com/entry/2020/04/21/034236④Dockerの設定
Dockerのインストールが終わったら、起動して、上の歯車のアイコンを押して、設定を開きます。
「General」の中にある「Expose daemon on …」をオンにし、下にある「Apply & Restart」を押します。
※Dockerの画面が出ない場合は、ここからアクセスします。
サンプルソースをダウンロードする
今回は下記のサイトから、サンプルコードをダウンロードします。
https://github.com/miyabayt/spring-boot-doma2-sample
下の画像にように、「Clone or download」という緑のボタンを押すと、下のような画面が出てくるので、「Download ZIP」を押してダウンロードします。
ZIPファイルをダウンロードして、デスクトップなどに解凍してから、Cドライブ直下に移動してください。
私の環境下では、Cドライブ直下に解凍すると、下記のように解凍されました。元のフォルダの構成がとは異なるので、エラーの原因になります。上記の画像と同じ構成になるように解凍してください。
IntelliJ IDEAにプラグインを導入する
事前準備が完了したら、IntelliJ IDEAに4つプラグインを導入します。
①Lombok pluginをインストールする
「構成」→「プラグイン」を押します。
下記のような、プラグインを追加する画面に変わります。
赤枠で囲ったところに「Lombok」と入力すると プラグインが表示されるので、インストールボタンを押して、インストールします。
②Eclipse Code Formatterをインストールする
次に「Eclipse Code Formatter」と入力すると プラグインが表示されるので、インストールボタンを押して、インストールします。
③Dockerをインストールする
次に「Docker」と入力すると プラグインが表示されるので、インストールボタンを押して、インストールします。
④Python Community Editionをインストールする
次に「Python Community Edition」と入力すると プラグインが表示されるので、インストールボタンを押して、インストールします。
※このプラグインはIntelliJ IDEAからおすすめされて入れたので、不要の可能性もあります。
プラグインのインストールが終わったら、OKを押すと前の画面に戻ります。導入したプラグインを設定する
次にプラグインの設定をしていきます。
「構成」→「設定」を押し、設定の画面を開きます。
①Lombok pluginの設定
左側の「ビルド、実行、デプロイ」を押し、「コンパイラー」を開き、その中の「注釈プロセッサー」を押します。
右側の画面が変わるので、「注釈処理を使用可能にする」にチェックを入れ、上の画面のようになればOKです。②Eclipse Code Formatterの設定
左側の「その他の設定」→「Eclipse Code Formatter」を押します。
右側の画面が変わるので、「Use the Eclipse code formatter」にチェックを入れ、「Eclipse Java Formatter config file」の右の「参照」を押すと、ファイル選択の画面が出てきます。
先程解凍した「spring-boot-doma2-sample-master」というフォルダを開き、その中の「eclipse-formatter.xml」を選びます。eclipse-formatter.xmlまでのパスは、Cドライブ直下に「spring-boot-doma2-sample-master」がある場合は、下記の通りになります。
C:\spring-boot-doma2-sample-master\eclipse-formatter.xml③Dockerの設定
左側の「ビルド、実行、デプロイ」を押し、「Docker」を押します。
「TCPソケット」を選び、接続が完了すればOKです。
接続できない場合は、まずはDockerが起動しているかどうか確認してください。以上でプラグインの設定は終了です。
IntelliJ IDEAの設定を変更する
プラグインの設定が完了したら、IntelliJ IDEAの設定を変更していきます。
①bootRunを実行している場合でもビルドされるようにする
Intellij上で「Ctrl+Shift+A」を押すと、小さい画面が出てくるので、「レジストリー」と入力します。
すると下に「レジストリー」と出てくるので、ここを選びます。
「compiler.automake.allow.when.app.running」という項目探して、右側のチェックボックスにチェックを入れます。終わったら、「閉じる」を押します。②コンソール出力の文字化けを防ぐ
Windowsの場合は、コンソール出力が文字化けするため、C:¥Program Files¥JetBrains¥IntelliJ Idea xx.x.x¥binの中にある「idea64.exe.vmoptions」というファイルを開きます。
一番下の行に「-Dfile.encoding=UTF-8」を追記して保存します。
③Java11を設定する
「構成」→「プロジェクト構造」を選びます。
設定が開くので、「プロジェクト設定」→「プロジェクト」を開き、「プロジェクトSDK」と「プロジェクト言語レベル」をそれぞれ、「11」を選びます。
もし、「プロジェクトSDK」で「11java version “11.0.7”」といった項目が出ない場合は、以下のページより「Java SE 11 (LTS)」の「JDK Download」からダウンロードして、インストールしてください。
https://www.oracle.com/java/technologies/javase-downloads.html※詳しいインストール手順が必要な場合はこちらを参考にしてみてください。
https://sukkiri.jp/technologies/processors/jdk/jdk-win_install.htmlDockerでMySQLを起動する
初回起動の場合
①docker-compose.ymlが存在するフォルダを確認する
サンプルコードの中には、DockerでMySQLを起動するための設定ファイル「docker-compose.yml」が含まれています。
Cドライブ直下に「spring-boot-doma2-sample-master」がある場合は、「C:\spring-boot-doma2-sample-master\docker」にあります。②Windows Power Shell を管理者権限で起動する
Dockerにコンテナなどを追加するので、タスクバーのwindowsマークの上で右クリックして、Windows Power Shell を管理者権限で起動します。
③Windows Power ShellからDockerのMySQLを起動する
急にWindows Power Shellが出てきて、難しそうですが、入力するのは以下の2行だけです。
cd C:\spring-boot-doma2-sample-master\docker docker-compose up先程の「docker-compose.yml」というファイルが存在するフォルダまで移動します。Cドライブ直下に「spring-boot-doma2-sample-master」がある場合は、以下のようになります。
cd C:\spring-boot-doma2-sample-master\docker“docker-compose”というコマンドが使えるかどうかを確かめるために、以下のように入力します。
docker-compose --version以下のようにバージョンが表示されればOKです。
docker-compose version 1.25.5, build 8a1c60f6次に以下のように入力して、MySQLを起動します
docker-compose upエラーが出てうまく行かない場合は、docker-compose.ymlが存在するフォルダまで移動してから、上記のコードを実行しているかどうか、確認してください。
このコマンドが終了すると、Dockerの画面が下記のように変わります。
簡単にDockerでMySQLを起動することができますね。2回目以降
Dockerを起動します。Dockerの画面が出ない場合は、ここからアクセスします。
白いクジラのアイコンの上で右クリックをして、「Dashboard」を選びます。
Dockerの画面が出てきたら、赤枠で囲った▶部分を押します。
MySQLが出てくるので、赤枠で囲ったボタンを押すと、サーバーの起動が始まります。
下の画面が出てくればOKです。
Dockerで起動したMySQLに、Intelij IDEAを接続する
Intelij IDEAを起動して、「オープンまたはインポート」を選びます。
Cドライブ直下に解凍した「spring-boot-doma2-sample-master」を選び、OKを押します。
下のような画面が出てくるので、「サービス」を選びます。
画面が変わると「Docker」が出てくるので、選ぶと接続が始まります。
接続が完了すると、以下のような画面になります。
以上で、Dockerで起動したMySQLに、Intelij IDEAで接続することができました。サンプルコードを動かす
ここからは、サンプルコードを動かしていきます。
サンプルコードを動かす前に、プラグインの設定とJavaの設定を確認してください。
確認が終了したら、Intelij IDEAの「ターミナル」を開きます。
①バージョン確認
ターミナルが起動したら、以下のように入力します。
cd C:\spring-boot-doma2-sample-master次に、以下のようにコードを入力します。
gradle -v以下のように、バージョンが表示されます。
------------------------------------------------------------ Gradle 6.3 ------------------------------------------------------------ Build time: 2020-03-24 19:52:07 UTC Revision: bacd40b727b0130eeac8855ae3f9fd9a0b207c60 Kotlin: 1.3.70 Groovy: 2.5.10 Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019 JVM: 11.0.7 (Oracle Corporation 11.0.7+8-LTS) OS: Windows 10 10.0 amd64②サンプルコードを動かす
次にサンプルコードを動かします。以下のように入力します。
gradlew composeUpプログラムが終わったら、以下のように入力します。
gradlew :sample-web-admin:bootRunしばらく待つと、95%で止まりますが、そのままでOKです。
これでアプリが起動したので、http://localhost:18081/adminにアクセスします。
上のような画面が出てきたら、成功です。お疲れさまでした。この記事は先輩エンジニアからアドバイスを受け、個人ブログから移植しました。おかしいところなどありましたら、ご指摘いただけると幸いです。
- 投稿日:2020-05-24T14:33:22+09:00
WordPress の wp-config.php のバリデーション
WordPress のデータベースへの接続は wp-config.php で定義されます。
その接続情報でデータベースに接続できるか判定する方法です。wp-config.php は、wordpress 以下にあるものをコピーします。
wp-settings.php は空の PHP です。フォルダー構造
$ tree . ├── connect_check.php ├── wp-config.php └── wp-settings.phpconnect_check.php#! /usr/bin/php <?php /* connect_check.php May/24/2020 */ // -------------------------------------------------------------------- include_once ("wp-config.php"); // -------------------------------------------------------------------- $host = DB_HOST; $user = DB_USER; $password = DB_PASSWORD; $db = DB_NAME; $dsn = 'mysql:dbname=' . $db . ';host=' . $host . ';charset=utf8'; fputs (STDERR,"*** 開始 ***\n"); print DB_USER . "\n"; try { $dbcon = new PDO ($dsn, $user,$password); $sql = "show schemas"; $sql = "select version()"; foreach ($dbcon->query($sql) as $row) { $str_json = json_encode($row); print $str_json . "\n"; } $dbcon = null; } catch (PDOException $e) { print('Error:'.$e->getMessage()); } fputs (STDERR,"*** 終了 ***\n"); // -------------------------------------------------------------------- ?>wp-settings.php<?php ?>実行結果
データベースが MariaDB の時
$ ./connect_check.php *** 開始 *** wordpress {"version()":"10.4.13-MariaDB","0":"10.4.13-MariaDB"} *** 終了 ***データベースが MySQL の時
$ ./connect_check.php *** 開始 *** wordpress {"version()":"5.7.28-log","0":"5.7.28-log"} *** 終了 ***接続が出来ない時
$ ./connect_check.php *** 開始 *** wordpress Error:SQLSTATE[HY000] [1045] Access denied for user 'wordpress'@'localhost' (using password: YES)*** 終了 ***バリデーションでオーケーになっても、まだ WordPress で接続できない時は、次を試して下さい。
sudo setenforce 0
- 投稿日:2020-05-24T14:30:09+09:00
MySQL他のテーブルをコピーする方法
概要
自分のメモ
テーブルコピー
<例>
CREATE TABLE `table_copy_target` like `table_original`;■適宜下記書き換える
作成するテーブル名:table_copy_target
コピーするテーブル名:table_original
レコードコピー
<例>
INSERT INTO `table_copy_target` (id,name,name_kana,name2_kana...) SELECT id,name,name_kana,name2_kana... FROM `table_original`;■適宜下記書き換える
作成するテーブル名:table_copy_target
コピーするテーブル名:table_original
- 投稿日:2020-05-24T14:14:06+09:00
PHP+LINE Messaging APIでクイズアプリを作ってみよう
今回やりたいこと
今回はPHPでLINE Messaging APIを使いクイズアプリを作成します。
仕様
・リッチメニューをタップしクイズを出題
・4つの選択肢から回答する
・正解の場合のみ解説の参考サイトurlを添付
・クイズはDB管理とし、クイズの追加・編集・削除機能がある管理画面の作成
※管理画面は後日公開予定です。こちらから友達追加してお試しいただけます!
https://lin.ee/3AOdmRRlo
イメージ
以上の仕様を実装します。
VPSで環境構築
VPSはこちらを参考に構築しました。詳細は下記サイトから確認してみてください。他にも参考になる記事がたくさんあるのでググってみて下さい!
ネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜
Messaging APIを設定
プログラム
DBカラム
quizzes : id | quiz | ans1 | ans2 | ans3 | ans4 | correct | url | deleted
quiz:問題文
ans1~4:選択肢1~4
correct:正解番号
url:解説サイトのurl
deleted:論理削除用index.php<?php $accessToken = 'アクセストークン'; //file_get_contents()関数でPOSTされたJSON文字列を取り出し $jsonString = file_get_contents('php://input'); //エラーログ記録 error_log($jsonString); //json_decode()関数でJSONをデコードして変数に格納 $jsonObj = json_decode($jsonString); //メッセージイベントを取得 //スタンプ、テキスト、画像などの場合がある $message = $jsonObj->{"events"}[0]->{"message"}; //ReplyToken取得 //受信したイベントに対して返信を行うために必要 $replyToken = $jsonObj->{"events"}[0]->{"replyToken"}; //メッセージタイプ取得 //ここで、受信したメッセージがテキストか画像かなどを判別 $type = $jsonObj->{'events'}[0]->{'type'}; // 送られてきたメッセージの中身からレスポンスのタイプを選択 //$typeがmessageの場合 if ($type == 'message') { //messageがtextであり、かつtextがクイズの場合クイズを返信する if ($message->{"text"} == 'クイズ') { //DB接続 $dbh = new PDO("mysql:host=localhost;dbname=DB名", 'ユーザー名', 'パスワード'); //sql文を変数にセット //DBから論理削除されていないクイズIDの配列を作る $sql = "SELECT id FROM quizzes WHERE deleted = 0"; $res = $dbh->query($sql); $quizIdArray = array(); foreach ($res as $row) { array_push($quizIdArray, $row['id']); } //クイズIDをランダムに並べ替える shuffle($quizIdArray); //クイズID配列の先頭要素をキーに、クイズを取得し表示する $targetQuizId = $quizIdArray[0]; $sql2 = "select * from quizzes where id = $targetQuizId"; $stmt = $dbh->query($sql2); $targetRow = $stmt->fetch(); //$messageDataにクイズの内容を代入する $messageData = [ 'type' => 'template', 'altText' => 'クイズ', 'template' => [ 'type' => 'buttons', 'text' => $targetRow['quiz'], 'actions' => [ [ 'type' => 'postback', 'label' => $targetRow['ans1'], 'data' => 'ans=' . $targetRow['ans1'] . '&num=1&correct=' . $targetRow['correct'] . '&id=' . $targetRow['id'] ], [ 'type' => 'postback', 'label' => $targetRow['ans2'], 'data' => 'ans=' . $targetRow['ans2'] . '&num=2&correct=' . $targetRow['correct'] . '&id=' . $targetRow['id'] ], [ 'type' => 'postback', 'label' => $targetRow['ans3'], 'data' => 'ans=' . $targetRow['ans3'] . '&num=3&correct=' . $targetRow['correct'] . '&id=' . $targetRow['id'] ], [ 'type' => 'postback', 'label' => $targetRow['ans4'], 'data' => 'ans=' . $targetRow['ans4'] . '&num=4&correct=' . $targetRow['correct'] . '&id=' . $targetRow['id'] ], ] ] ]; //messageがtextであり、かつtextがいいえであった場合の返信を$massageDataに代入 }elseif ($message->{"text"} == 'いいえ') { $messageData = [ 'type' => 'text', 'text' => 'いつも[解剖学クイズbot]をご利用いただきありがとうございます。クイズチャレンジお疲れ様でした!楽しんでいただけましたでしょうか?またのチャレンジをお待ちしております!' ]; $messageData2 = [ 'type' => 'text', 'text' => '再度クイズにチャレンジする場合は、「クイズにチャレンジ!」をタップしてください!' ]; } else { //$typeが上記以外の場合の返信内容を$messageDataに代入 $messageData = [ 'type' => 'text', 'text' => '申し訳ありません、その操作には対応しておりません。「クイズにチャレンジ!」をタップしてクイズにチャレンジしてみて下さい。' ]; } } //$typeがpostbackの場合 if ($type == 'postback') { // JSONデータからポストバックデータを取得 $postback = $jsonObj->{"events"}[0]->{"postback"}->{"data"}; //文字列を名前と値に分解し変数に代入 parse_str($postback, $data); //各値を変数に代入 $answer = $data["ans"]; $number = $data["num"]; $id = $data["id"]; $correct = $data["correct"]; //ユーザーの選択した選択肢と正解番号を比較し、正解・不正解の場合で返信内容を$massageDataに代入 //正解の場合 if ($number == $correct) { $dbh = new PDO("mysql:host=localhost;dbname=DB名", 'ユーザー名', 'パスワード'); //選択された選択肢のIDから解説サイトのurlを取得 $sql3 = "SELECT url FROM quizzes WHERE id = $id"; $stmt2 = $dbh->query($sql3); $targetRowUrl = $stmt2->fetch(); $url = $targetRowUrl['url']; //$massageDataに返信内容を代入 $messageData = [ 'type' => 'text', 'text' => $answer . 'ですね。' ]; $messageData2 = [ 'type' => 'text', 'text' => '素晴らしい!『正解』です!!!' ]; $messageData3 = [ 'type' => 'template', 'altText' => '解説', 'template' => [ 'type' => 'buttons', 'title' => '解説です!', 'text' => '確認してみてね!', 'actions' => [ [ 'type' => 'uri', 'label' => 'Wikipediaへ移動', 'uri' => "$url", ] ] ] ]; $messageData4 = [ 'type' => 'template', 'altText' => '次のクイズにチャレンジしますか?', 'template' => [ 'type' => 'confirm', 'text' => '次のクイズにチャレンジしますか?', 'actions' => [ [ 'type' => 'message', 'label' => 'はい', 'text' => 'クイズ' ], [ 'type' => 'message', 'label' => 'いいえ', 'text' => 'いいえ' ], ] ] ]; }else{ //不正解の場合の返信内容を$massageDataに代入 $messageData = [ 'type' => 'text', 'text' => $answer . 'ですね。' ]; $messageData2 = [ 'type' => 'text', 'text' => 'むむ、、『不正解』です。' ]; } } //メッセージの数に合わせ条件分岐 if ($messageData4 == true) { $response = [ 'replyToken' => $replyToken, 'messages' => [$messageData,$messageData2,$messageData3,$messageData4] ]; }elseif ($messageData3 == true) { $response = [ 'replyToken' => $replyToken, 'messages' => [$messageData,$messageData2,$messageData3] ]; }elseif ($messageData2 == true) { $response = [ 'replyToken' => $replyToken, 'messages' => [$messageData,$messageData2] ]; }else{ $response = [ 'replyToken' => $replyToken, 'messages' => [$messageData] ]; } error_log(json_encode($response)); //curlセッション初期化。urlも設定 $ch = curl_init('https://api.line.me/v2/bot/message/reply'); //curlオプション設定 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer ' . $accessToken )); //curl実行 $result = curl_exec($ch); //エラーログ記録 error_log($result); //curlセッション終了 curl_close($ch); ?>工夫した点
・クイズをDB管理とし、追加・編集・削除機能をつけた
・クイズをランダムに出題
・ユーザーからのレスポンスに応じて異なる処理改善案
・メッセージの数に合わせた条件分岐がダサいのでスマートに書けないものか。。。
・クイズ内容を身体の部位ごとに指定するなど、分野を分ける
・解説を外部サイトに依存しているが、bot内で完結しても良いか
・その場合、画像付きの解説などを入れるとUXが高められそう
- 投稿日:2020-05-24T11:59:07+09:00
【MySQL】外部キー制約を一時的に無効にする
- 投稿日:2020-05-24T08:20:19+09:00
MariaDB で、root のパスワードを再設定
MariaDB 10.4.13 でのルートのパスワードを忘れた時に、再設定する方法です。
次のページを参考にしました。
How To Reset Your MySQL or MariaDB Root Password1) mariadb の停止
sudo systemctl stop mysqld
2) セーフモードで mariadb を立ち上げる
sudo mysqld_safe --skip-grant-tables --skip-networking &3) root でアクセス
$ mysql -u root Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.4.13-MariaDB Arch Linux Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>4) グラントテーブルのロード
MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.003 sec)5) root パスワードの変更
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'tiger123';6) 結果を反映して、接続の遮断
MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> exit; Bye7) セーフモードで動いている mariadb の停止
$ ps ax | grep mysql 5284 pts/1 S 0:00 sudo mysqld_safe --skip-grant-tables --skip-networking 5285 pts/1 S 0:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables --skip-networking 5370 pts/1 Sl 0:00 /usr/bin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=/var/lib/mysql/iwata.err --pid-file=iwata.pid 5479 pts/1 S+ 0:00 grep mysql $ sudo kill -9 5284 5285 5370 [1]+ Killed sudo mysqld_safe --skip-grant-tables --skip-networking8) mariadb を起動
sudo systemctl start mysqld
9) root で接続
$ mysql -uroot -ptiger123 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.4.13-MariaDB Arch Linux Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
- 投稿日:2020-05-24T00:22:46+09:00
Amazon Linux2 にMySQLを入れる際のエラー
AWS EC2インスタンスにLAMP環境構築する際に、MySQLインストールでエラーに詰まったのでメモメモ。
エラーの原因を結論から言えば、AmazonLinux2にはデフォルトでMySQLは用意されておらず、MariaDBがちょこんと居座ってること。そのため対処として公式ページからMySQLをインストールして、MariDB消せばOKである。
前提
- Amazon Linux 2 AMI (HVM) SSD Volume Type
- MySQL Ver 14.14 Distrib 5.7.30, for Linux (x86_64) ←これを入れたい
過程と対処
EC2インスタンスにssh接続後、ApacheとPHPをyumインストール。問題なく進み、そのノリでMySQLもインストール。
yum install -y mysql-community-serverここで
No package mysql-community-server available.
とエラーを返される。どうやらパッケージがないらしい。以下で調べてみると確かに無かった。yum list mysql*そこで、公式から追加することに(→MySQL Yum Repository)。ただしAmazonLinux2はcentOS7ベースということなので、追加するのはel7を選択。
yum install http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpmちゃんとリポジトリに追加されてるかを次で確認
yum repolist
mysql80-community-release-el7-3.noarch
を確認。使用したいバージョンは5.7なので、5.7を有効化させる必要がある(最新バージョンの8.0のインストールによって旧バージョン5.7のリポジトリもセットでインストールされる)。vi /etc/yum.repos.d/mysql-community.repomysql-communityのレポジトリ設定をいじる。上のコマンドで設定ファイルを開いたらMysql8.0のenabledの欄を0にして、Mysql5.7のenabledの欄を1に変更する。これによってインストールの方向が5.7に向く。
さて、これで
yum install mysql-community-server
で解決かと思えば、次は依存関係のエラーが発生。エラー文を確認するとAvailable: 1:mariadb-libs
の文字列を数件発見。MariaDB...?どうやらAmazonLinux2(CentOS7も同様)ではMariaDBがデフォルトで入っており、MySQLインストールの際に邪魔になってしまうらしい。今回はMySQL使いたいので、MariaDBを削除することに。
yum remove mariadb-libsこれの後にyumインストールしたら無事に解決しました。
参考
CentOS 7にMySQL 5.7をyumでインストール
AWS Amazon Linux2にMySQL5.7を構築する
Amazon Linux2でmysqlを入れようとしたらエラーが出た
パッケージ依存関係を解消する(rpm)