メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

AWS CloudFrontのキャッシュを削除する (Invalidation)

キャッシュのクリア ⇒ Invalidation

Invalidation、CloudFrontではキャッシュのクリアをこう呼びます。

Distribution一覧からIDのリンクをクリックして
Invalidastionsタブへ。

Create InvalidationsボタンをクリックしてObject Pathsに /* を入力します。

すると行が追加されStatusがIn Progressでぐるぐる。
これが結構時間かかります・・・ぶっちゃけ遅い。

1[MB]未満、ファイル数50未満でも20分弱かかりました。

1ファイルでやったら1分以内でした^^;
実行時期にも依ると思います。

料金

無効化にも課金が発生するのですね。

/*
/index.html

などの指定をパスと呼び、ファイル指定でもワイルドカードしても1行(?)1パスとカウントされるようです。

1000パスまでは無料で、それ以降は
0.005 [USD]
とのこと。

 

お蔵入りからの投稿でした^^;
(投稿してたと思ったら下書きのままだった)

DockerでOracleデータベース11g XEを構築

以前にも似た記事を書きましたが、最近はOracleのDockerfileもちゃんとしてきた(?)と聞いており機会があったので使ってみました。

以前の記事とOracleの公式docker-images

Docker上にOracle 11g XEを立てた - メンチカツには醤油でしょ!!
Docker上のOracleで初期化処理したい - メンチカツには醤油でしょ!!
github.com

手順

公式のoracle-docker-imagesをcloneします。

> git clone git@github.com:oracle/docker-images.git oracle-docker-images
> cd oracle-docker-images/OracleDatabase/

シェルしか入っていないのでgit bashで実行します。

$ ./buildDockerImage.sh -v 11.2.0.2
Checking if required packages are present and valid...
md5sum: oracle-xe-11.2.0-1.0.x86_64.rpm.zip: No such file or directory
oracle-xe-11.2.0-1.0.x86_64.rpm.zip: FAILED open or read
md5sum: WARNING: 1 listed file could not be read
MD5 for required packages to build this image did not match!
Make sure to download missing files in folder 11.2.0.2.

oracle-xe-11.2.0-1.0.x86_64.rpm.zip がないと言っていますね。
そうなんです、インストールイメージはOTNからライセンス条項に同意のうえダウンロードする必要があるんですね。下記のリンクより Oracle Database Express Edition 11g Release 2 for Linux x64 をダウンロードして、シェルが参照しているディレクトdocker-images/OracleDatabase/dockerfiles/11.2.0.2/に配置します。

Oracle Database Express Edition 11g Release 2のダウンロード

Windows環境でも、Docker上にOracleを構築するので、Linux版をダウンロードします。

$ ./buildDockerImage.sh -v 11.2.0.2
Checking if required packages are present and valid...
oracle-xe-11.2.0-1.0.x86_64.rpm.zip: OK
==========================
DOCKER info:
(かなり長いので中略)
Successfully built 78db1a697c0e
Successfully tagged oracle/database:11.2.0.2-xe
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
Oracle Database Docker Image for 'xe' version 11.2.0.2 is ready to be extended:
--> oracle/database:11.2.0.2-xe
Build completed in 117 seconds.

はい、無事に成功しました。

確認

> docker images
REPOSITORY        TAG           IMAGE ID       CREATED       SIZE
oracle/database   11.2.0.2-xe   78db1a697c0e   2 hours ago   1.13GB
oraclelinux       7-slim        9870bebfb1d5   2 weeks ago   118MB
・・・

さて実行みましょう

> docker run oracle/database:11.2.0.2-xe
Error: The container doesn't have enough memory allocated.
A database XE container needs at least 1 GB of shared memory (/dev/shm).
You currently only have 64 MB allocated to the container.

これはコンテナのメモリが1GB無いから出るエラーですので、メモリ1GBを指定してあげましょう。(--shm-size=1gを追加します)

> docker run -d --name my-oracle-database --shm-size=1g -p 1521:1521 -p 8080:8080 -e ORACLE_PWD=MyOraclePassword oracle/database:11.2.0.2-xe

これで立ち上がったと思います。
試しに接続してみるには、ホストPCのsqlplusを使ってもいいですし、コンテナ内のsqlplusを呼び出す方法もあります。

> sqlplus sys/MyOraclePassword@localhost:1521/XE as sysdba

> docker exec -it my-oracle sqlplus sys/MyOraclePassword@XE as sysdba

初期化SQLや初期データの投入

初期化スクリプト・初期化SQL・初期データなどの入ったディレクトリをボリュームマウントします。
ディレクトリ内の拡張子 .sh または .sql については自動で実行されます。実行順をより明示的にするために 01_alter_user.sql など頭に数値を付ける命名が推奨されています。

また、shやsqlファイルは、utf-8のLFで保存しておくとより安心でしょう。

> docker run -d --name my-oracle --shm-size=1g -p 1521:1521 -p 8080:8080 -e ORACLE_PWD=MyOraclePassword -e TZ="Asia/Tokyo" -v C:\my-docker\oracle\startup:/docker-entrypoint-initdb.d/startup -v C:\my-docker\oracle\oradata:/u01/app/oracle/oradata oracle/database:11.2.0.2-xe

相対パス指定だとうまくいかないことがあります。
こんなメッセージが出ますので絶対パスで指定することが推奨されています。

docker: Error response from daemon: create 【ファイルパス】: "【ファイルパス】" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.

ファイルだけ指定するのもダメです

> docker run -d --name my-oracle --shm-size=1g -v C:\my-docker\oracle\startup\01_alter_user.sql:/docker-entrypoint-initdb.d/startup oracle/database:11.2.0.2-xe
0e735b3b58b3d9067560fa9fec41f67d2411c3fea7a481f2e8eafc41cbae3c27
docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused "process_linux.go:368: container init caused \"rootfs_linux.go:57: mounting \\\"/C/my-docker/oracle\startup/01_alter_user.sql\\\" to rootfs \\\"/var/lib/docker/aufs/mnt/d898bc13bb479bbcb411fb45c242fbfcac0bbeaeacafaa3054cb1025e87c1af8\\\" at \\\"/var/lib/docker/aufs/mnt/d898bc13bb479bbcb411fb45c242fbfcac0bbeaeacafaa3054cb1025e87c1af8/u01/app/oracle/scripts/startup\\\" caused \\\"not a directory\\\"\""
: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

startupディレクトリ配下には 01_alter_user.sql などのようなファイルに下記のようにsqlを記述しておけば、コンテナ始動時に実行されます。

-- ユーザー作成
CREATE USER MY_ORACLE_USER IDENTIFIED BY "MyUserPassword" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;

また、下記のようにimpを実行するシェルを 03_imp.sh のように同じディレクトリにおいておけばdocker runするだけでDB/ユーザー/データが手に入って便利かと思います。

#!/bin/bash

imp MY_ORACLE_USER/MyUserPassword@XE file=/docker-entrypoint-initdb.d/startup/02_my_data.dmp full=y

参考

Oracle Database on Docker · docker-images/README.md at master · oracle/docker-images · GitHub

Error: The container doesn't have enough memory allocated. A database XE container needs at least 1 GB of shared memory (/dev/shm). · docker-images/FAQ.md · oracle/docker-images · GitHub

Amazon LightsailにJenkinsがないので、自分でインストール

経緯

cronで起動するシェルを実行したい時とかって、CloudWatch⇒AWS Lambdaって構成もいいんですが、もう少しこねくりまわしたい時や、処理後のインテグレーションがより簡単な方が良いなぁ、と考えるとJenkinsが使いたくなったりする時があると思います。

Lightsailに元々あると良いのですがなかったので自分で入れたときのメモです。

セットアップ手順

インスタンス作成へ

Lightsailからインスタンスの作成をクリック。

f:id:ryoichi0102:20171211121430j:plain

オプションの選択

インスタンスイメージの選択 内の 設計図の選択 で OSのみ をクリックし Ubuntu を選択。
ロケーションやインスタンスプラン・インスタンス名を確認のうえ、最下部の作成をクリック。

f:id:ryoichi0102:20171211121444j:plain

パブリックIPの確認/ポートの開放

Jenkinsは8080を使うので開けておきます。
と同時にパブリックIPも確認しておきます。
インストールが完了したらhttp://【パブリックIP】:8080/ でアクセスします。

f:id:ryoichi0102:20171212213952j:plain

SSHを使用して接続

f:id:ryoichi0102:20171212211451j:plain

タイムゾーンAsia/Tokyoに変更

Jenkinsでタイマー処理などをする際はJSTの方が見易いので変更します。

$ sudo timedatectl set-timezone Asia/Tokyo

Java8をインストール

$ sudo add-apt-repository ppa:webupd8team/java

$ sudo apt-get update

$ sudo apt-get install oracle-java8-installer

Jenkinsをインストール

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

$ sudo apt-get update

$ sudo apt-get install jenkins

Jenkins自動起動設定

$ sudo apt-get install sysv-rc-conf

$ sudo sysv-rc-conf jenkins on

Jenkinsの設定

http://【パブリックIP】:8080/ でアクセスすると画面が出てきます。
なお、何かの間違いでログインできなくなったら

$ sudo vi /var/lib/jenkins/config.xml

で<useSecurity>false</useSecurity>に編集して

$ sudo service jenkins restart

で再始動すると半ログイン状態になるので、ユーザーを作成しておきます。

参考

Ubuntu 16.04 LTS : システムのタイムゾーンを設定する : Server World

UbuntuにJava8環境構築 - Qiita

Debian Repository for Jenkins

[Jenkins][Ubuntu] UbuntuにJenkinsをインストール - Qiita

ubuntu版chkconfigのsysv-rc-confを使う - Qiita

Jenkinsでログインできなくなった時の対処法 - としたにあんの左脳