信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    素敵だら! Linux コマンド ~基本編 その3~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。今回も前回に引き続き「~基本編 その3~」です。■find私の一番好きなコマンド find。その名前からもわかる通り、ファイルやディレクトリなどを探すコマンドです。まずは基本的な使い方から。今いるディレクトリの中から admin ユーザーが作成した、test_{日付}.txt ファイルってどこにあったっけ?を調べるときはfind ./ -user admin -type f -name test*.txt のようにします。`-name` は探す対象の名前を指定するオプションで、ワイルドカードが使用できます。※ `-regex` を使えば正規表現も可能です`-type` は探す対象の種類を指定します。種類は以下の通りです。ファイル `f`ディレクトリ `d`シンボリックリンク `l`これだけでも結構便利なんですが、 `find` コマンドの肝はなんといっても `-exec` オプション。これを使えば検索した結果に対して、コマンドを実行できます。例えば先ほどの test.txt をすべて削除したいときは、find ./ -user admin -type f -name test*.txt -exec rm {} \; といった具合です。この例でいうと、 `{}` に検索結果のファイルが一つずつ置き換わり、 `rm` によって削除されます。末尾についている `\;` は何かというと、セミコロンが `-exec` オプションの終了を意味し、バックスラッシュはエスケープだそうです。   参考: https://stackoverflow.com/questions/20913198/why-are-the-backslash-and-semicolon-required-with-the-find-commands-exec-optio`\;` の代わりに `+` を使用することで、コマンドに渡していた検索結果を、一つずつではなく、まとめた形で渡すことができます。上記の例でいえば、 `\;` はrm test1.txt rm test2.txt rm test3.txt となり、`+` はrm test1.txt test2.txt test3.txt となります。他にも検索するディレクトリの階層の深さを指定する `-mindepth` `-maxdepth`特定のディレクトリ検索対象から除外する `-prune`更新日からファイルを探す `-mtime`など、機能がとても充実しています。以上、細かい要望にも応えてくれる素敵な `find` コマンドでした。
  • テクログ

    AWS CLIを使ってIAMユーザーの登録から二段階認証をオンにするまでのスクリプト

    नमस्ते! आप कैसे(कैसी) हैं?ナマステー!こんにちは。インフラ担当のまつやです。弊社ではWebサービスの基盤としてAWS(Amazon Web Service)を主に使っています。エンジニアはAWSコンソールからログインして作業することが多いため、メンバーが増えるたびにアカウントを発行する必要があります。このアカウント作成はAWSコンソールにログインし、IAM(Identity and Access Management)から作成できますが、発行頻度が増えてくるとGUIからのアカウントの発行・通知がやや大変になってきました。そこで、AWS CLI(コマンドラインインターフェイス)を利用して、ユーザー発行に必要なコマンド操作を一括で行えるシェルスクリプトを作成することにしました。また弊社ではAWSコンソールからのログインにパスワード設定の上、MFAデバイスによる二段階認証を必須としています。この二段階認証も同時に設定してしまい、パスワード情報と二段階認証用のQRコードをユーザーに通知するだけで済むようにしたいと思います。Amazon Linuxのbash環境で作成しています。python(2.7)aws-cli(最新版)oathtoolが必要になります。以下が本体のシェルスクリプトです。#!/bin/bash set -e # 環境変数設定 export BASE_DIR=${HOME}/iam # # usage # usage_exit() {  echo "usage:"  echo "${0} -u USERNAME [-g GROUP] [-a] [-h]" 1>&2  echo "-a: create API key for each user." 1>&2  echo "-h: this help." 1>&2  exit 1 } #パスワード生成コマンド password_command="cat /dev/urandom | tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ+\-!' | fold -w 16 | grep -E '[123456789]' | grep -E '[+\-\!]' | grep -E '^[123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]' |head -n 1" #引数の設定 while getopts "u:g:h" OPT do    case $OPT in        "u") CREATE_USER="true"; username=${OPTARG}            ;;        "g") ADD_TO_GROUP="true"; group=${OPTARG}            ;;        "h") usage_exit            ;;        \?) usage_exit            ;;    esac done # 引数でユーザーを指定しない場合終了する。 [ "${CREATE_USER}" != "true" ] && usage_exit #IAMユーザーのクレデンシャル情報格納用のディレクトリを作成。  if [ "${CREATE_USER}" = "true" ]; then      if [ ! -e "${BASE_DIR}/account/${username}" ]; then        mkdir -p ${BASE_DIR}/account/${username}      else       echo "Directory ${username} already exists."      fi #IAMユーザー作成   aws iam create-user --user-name ${username} --profile default   aws iam wait user-exists --user-name ${username} #二段階認証の仮想MFAデバイスを作成   aws iam create-virtual-mfa-device --virtual-mfa-device-name ${username} \   --bootstrap-method Base32StringSeed \   --outfile ${BASE_DIR}/account/${username}/${username}_secret.txt #クレデンシャル情報ファイルに出力する内容  secret_key=`cat ${BASE_DIR}/account/${username}/${username}_secret.txt`  signin_url="https://AWSアカウント名.signin.aws.amazon.com/console"  password=$(eval ${password_command}) #ログインパスワードの設定&初回ログイン時のパスワード強制変更をオンにする   aws iam create-login-profile --user-name $username \   --password ${password} --password-reset-required --profile default #クレデンシャル情報をファイルに出力 echo "User name,Password,Secret access key,Console login link ${username},${password},${secret_key},${signin_url}" > ${BASE_DIR}/account/${username}/${username}_password.csv #二段階認証用のQRコードを生成  python /home/ec2-user/iam/qrcodegen.py "otpauth://totp/Amazon%20Web%20Services:${username}@AWSアカウント名?secret=${secret_key}&issuer=Amazon%20Web%20Services" ${BASE_DIR}/account/${username}/${username}_qr.png # Login Profile が完全にできているか確認してから次へ進む  aws iam wait user-exists --user-name ${username} #ワンタイムパスワードを発行する code="oathtool --totp -d 6 --time-step-size=30s --base32 ${secret_key}"        code1=$(eval ${code})        while :         do           code2=$(eval ${code})            if [ $code2 != $code1 ]; then                 break;            fi         done #二段階認証をオンにする  aws iam enable-mfa-device --user-name ${username} \  --serial-number arn:aws:iam::XXXXXXXXXXXX:mfa/${username} \  --authentication-code1 ${code1} --authentication-code2 ${code2} #(注: arn:aws:iam::XXXXXXXXXXXX:mfa の12桁のXXXXXXXXXXXXにはAWSアカウントIDが入ります)  else  usage_exit  fi # 引数で-gを指定した場合 ユーザー ${username} にグループ ${group} を割り当てる  if [ "${ADD_TO_GROUP}" = "true" ]; then     aws iam wait user-exists --user-name ${username}     aws iam add-user-to-group --group-name ${group} \     --user-name ${username} \     --profile default  fi -u username の形式でユーザー名の指定を必須にしています。ここで指定したユーザー名を使って処理が進みます。まず、基本のIAMユーザー作成を行います。aws iam wait user-existsでユーザーが作成されたことを確認して先に進みます。次に二段階認証用の仮想MFAデバイスを作成します。AWSコンソールから作成する場合はIAMユーザーと同じ名前で作成されますが、CLIで作成する場合はデバイス名が重複しない限りはIAMユーザー名と異なっていても別の名前のデバイスを作成し、関連付けをすることができます。ここでは管理が面倒になるので、IAMユーザ名と一致させます。MFAデバイス作成と同時にシークレットキーを発行します。ここではQRコードの形でも発行できますが、シークレットキーと同時に発行することができないため、シークレットキーを発行し、そのシークレットキーを元に別途QRコードを作成します。次にログインパスワードを設定します。初回ログイン時に強制的にパスワード変更させるオプションを有効にします。この時発行するパスワードですが、cat /dev/urandomして tr -dcとかで切り出して、16文字のものを生成しています。小文字のエル、数字の0と大文字小文字のオーは除外しています。パスワードコマンドはこれに限らずpwgenとかが使えるならそれでいいかと思います。次にQRコードの生成です。pythonのqrcodeライブラリを使います。pipでインストールします。pip install qrcode インストールしたら、中間プログラムを作成します。ここではqrcodegen.pyとしています。qrcodegen.pyimport qrcode import sys import os args = sys.argv qr = qrcode.QRCode(  version=4,  error_correction=qrcode.constants.ERROR_CORRECT_M,  box_size=6,  border=4, ) qr.data = args[1] qr.save_path = args[2] qr.add_data(qr.data, 20) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img.save(qr.save_path) これを使ってQRコードを生成します。MFAデバイスを作成したときの ${username}_secret.txt を${secret_key}に指定します。${username}@AWSアカウントの箇所はご自身の環境に合わせて読み替えて下さい。これでIAMユーザー毎のクレデンシャル情報格納ディレクトリにQRコードが生成されます。二段階認証を有効にします。oathtoolを使用してワンタイムパスワードを発行します。これを都合2回入力することで二段階認証が有効になります。Amazon Linuxでは基本のリポジトリには存在しないので、epelリポジトリからインストールします。epelリポジトリを有効にする方法はここでは割愛します。発行したシークレットキーを元に6桁のワンタイムパスワードを発行します。whileでこのパスワード発行コマンドを実行し、初めにに発行した値と異なる値になるまで回します。ここでcode1とcode2を取得します。code1とcode2を使って二段階認証をオンにします。最後に-gでグループを引数に指定した場合の処理です。指定したグループをユーザーに割当てます。指定しなければスルーします。以上のようにして、事前に二段階認証をオンにした状態でIAMユーザー情報を各エンジニアに展開しています。エンジニアは発行されたパスワードとQRコード、あるいはシークレットキーを元にAWSコンソールにログインできます。この他に、二段階認証がオフになっているユーザーがいないかを監視するLambdaのスクリプトも作成していますが、それについてはまたの機会に。・参考にした記事 https://dev.classmethod.jp/etc/aws-cli-iamuser-bulk-create/ https://dev.classmethod.jp/cloud/aws/virtual-mfa-by-aws-cli/それではまた!फिर मिलेंगे!
  • テクログ

    素敵だら! Linux コマンド ~基本編 その2~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。今回は前回に引き続き「~基本編 その2~」です。echocatrm■echo言わずと知れた文字列出力コマンド `echo` です。`echo` の後に続いて文字列を入力することで、その文字列をそのまま出力してくれます。だから echo(やまびこ)というわけですね。`echo` 自体は多機能ということはありませんが、なくてはならない存在です。主にメッセージの表示に使用され、変数も展開して表示することができるのでスクリプト内で多用されます。知っておくべきオプションとしては `e` オプションで、エスケープシーケンスを解釈して出力してくれます。echo -e 'hogehoge\npuyopuyo' ※クォーテーションで文字列を囲まない場合は「hoge\\npuyo」のようにエスケープシーケンスにバックスラッシュ「\」を2つ付けますそのほかしばしば利用されるのが、ファイルに文字列を上書きまたは追加で書き込みたい時です。リダイレクトの `>` または `>>` を使用して `echo` による画面への出力(標準出力といいます)をファイルへの出力に変換します。・上書き(または新規作成)echo hogehoge > file ・追加echo hogehoge >> file もちろん `e` オプションを使用して文字の途中に改行を入れることもできます。■cat`cat` は concatenate (連結)のことで、ファイルとファイルを連結した結果を標準出力します。`echo` と同様にリダイレクトを使用することで、連結した結果をファイルに出力することもできます。指定するファイルは1つでもよく、その場合ファイル内容が出力されるだけになるので、ファイルの閲覧にもしばしば使用されます。結合してファイルに出力※指定するファイルはいくつでもよいcat hoge.txt piyo.txt > file.txt hoge.txt の内容を出力して閲覧cat hoge.txt またヒアドキュメントを用いることで、`echo` ではできなかった複数行の文字列を出力することもできます。・ヒアドキュメントで標準出力cat << EOS hogehgoe piyopiyo EOS ・ヒアドキュメントでファイル出力cat << EOS > file.txt hogehgoe piyopiyo EOS ■rm`rm` はファイルとディレクトリの削除コマンドです。rm file.txt のようにすることで指定したファイルを削除することができます。ディレクトリを削除するときは `r` オプションをつけて再帰的に(recursive)削除する必要があります。その時にはディレクトリ内のファイルも併せて削除されます。rm -r dir 削除したいファイルが複数ある場合、一つずつ指定することもできますが、ワイルドカードを使用することで一気に削除することができます。例えばディレクトリ test にファイル hoge1, hoge2, piyo3 が存在し、ファイルのみ全て削除したいときにはrm test/* hoge とファイル名のついたファイルのみ全て削除したいときはrm test/hoge* とすることで実現できます。`rm` によってファイルを削除するとき、環境にもよりますが、誤った削除を避けるためファイルを削除する毎に確認のプロンプトが表示され、y キーと Enter キーを押下することで削除が実行されます。しかし削除対象のファイルが多数ある場合、一つ一つ削除するごとに確認するのは骨が折れます。そのようなときには強制的に削除するオプション `f` が利用できます。使用には注意が必要で、バックアップを取っていない環境やレビューを通っていない作業である場合、基本的にやってはいけません。組織によっては、禁止していたり規則を設けているところもあるかもしれません。ひとつパスやファイル名を間違えただけで、削除してはいけないファイルが抹消され、大規模な障害となることもあります。なかでも `r` オプションと組み合わせた強制再帰的削除はとても危険です。以前私の勤めていた会社の同僚が開発環境で以下のコマンドをroot ユーザーで実行してしまいました。rm -rf / これは Linux のシステムを含めまるごと削除してしまうコマンドです。ひとつの開発環境が消え去り、大きな損害を生むことになりました。上記コマンドを実行した動画がネットに投稿されていますので、興味のある方は探してみてください。または個人の仮想環境で試してみるのも良いと思います。以上、`echo`, 'cat', 'rm' のご紹介でした。
  • テクログ

    素敵だら! Linux コマンド ~基本編~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。本日は「~基本編~」。基本的かつ必要不可欠となるコマンドです。lscdcp■ ls`ls` は指定されたディレクトリにあるディレクトリ・ファイルの情報を出力するコマンドです。オプションに `ls -la` などとすれば、隠しファイル、カレントリ・親ディレクトリを含む全てのディレクトリ・ファイル(`-a`)を詳細な(`-l` )情報とともに出力することができます。オプション `-la` は便利なので、しばしば `l` や `ls` のエイリアスに設定されることもあります。`-la` しか普段使いされないといってもよいほどですが、もちろんオプションはそれだけではありません。`-h` `--human-readable` はファイルサイズの単位を 4096 であれば 4.0K のように読みやすい形で出力してくれます。`-m` はリスト対象をカンマ区切りで出力してくれます。などなど、ほかにも意外と便利なオプションが揃っています。また、他のコマンドと組み合わせて使われることもあります。例えばカレントリディレクトリ内にあるファイル数を知りたい場合はls -A | wc -l などとすることで、カレントリ・親ディレクトリを除く(`-A`)全てのディレクトリ・ファイルの数を集計(`wc -l`)できます。Linux には“パイプ”と呼ばれるものがあり、パイプはコマンド(プロセス)の出力を別のコマンド(プロセス)に入力することができ、上記のように縦線(|)で書き表されます。`ls` コマンドで出力した情報をこの“パイプ”機能によって他のコマンドに渡すことにより、より有用な情報を得ることができるわけです!■ cd`cd` はディレクトリを移動するためのコマンドです。オプションはあまりないので、しばしば使う小技をご紹介します。ホームディレクトリに移動するcd `cd` だけです。ホームディレクトリとは echo $HOME などとすると表示されるディレクトリで、ログイン直後は大体そのディレクトリに居ることになります。ひとつ前のディレクトリに戻るcd - ハイフン(`-`)をパスにすることで、ひとつ前に居たディレクトリに移動することができます。一つ前のコマンドで指定したディレクトリに移動するcd $_ `$_` は Bash の環境変数で、最後に実行したコマンドの引数が格納されています。例えばあるファイルの場所を確認するために `ls` コマンドを使用し、そのファイルが見つかったとします。次にそのディレクトリに移動したいものの、もう一度パスを指定するのが面倒ですよね?そんな時に上記のコマンドを実行することで、入力を省略することができます!※ Bash とは Linux OS を動かしているコア部分(カーネル)に処理を中継いでくれる、コマンドベースのインターフェースを持ったソフトウェアの一つです※ 他にも csh, ash, zsh などがあり、最近では fish が人気のようです`$_` 他、Bash の環境変数については以下を参照https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html■ cp`cp` はファイルやディレクトリをコピーするコマンドです。第一引数にコピー元、第二引数にコピー先を指定します。また、ディレクトリをコピーする時には、再帰コピーを示す `-R, -r, --recursive` のいずれかのオプションをつける必要があります。他にもコピー先が既に存在していた場合に強制上書き(`-f`)したり、上書き時に確認をする(`-1`)オプションなどがあります。単純にディレクトリやファイルを別の場所にコピーする際に使用する他にも、例えば設定ファイルを編集する前にバックアップを取っておきたいときなどは、cp file{,.back} とすると便利です。上記ではコピー先となる第二引数を省略し、コピー元のファイル名に `{,.back}` を付け加えています。こうすることで結果、実行したディレクトリでは file.back が生成されます。わざわざ第二引数を指定しなくて済むわけです!この `{}` は“ブレース展開”というもので、cp コマンドに限ったものではなく、例えば ファイルを移動する・ファイル名を変更する際に使用する `mv` では、mv file{,.old} とすることで、ちょっと名前を変えてファイルを置いておくこともできます。“ブレース展開”は他にも一度に複数のファイルを指定したりできるなど面白い機能ですが、今回は割愛します。`{}` については以下を参照https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html以上少ないですが、`ls`, 'cp', 'mv' のご紹介でした。
  • テクログ

    Aurora Serverless が遂に登場!

    マスオです。Aurora Serverless MySQL の一般利用が開始※画像も上記から引用以前のAWSイベントで発表され限定プレビューだったサーバレス版についてこのほど遂に一般利用が解禁となりました!東京リージョンでも利用可能となったので早速さわってみたのですが、現状での制限が与えた影響などを書いていきたいと思います。パブリックアクセスができない通常はパブリックアクセスするしないを選べますが、そもそも設定できないローカル環境からつながらない!とか言われたので EC2 からつなぐようにしてもらったレプリカ機能がないアプリからのDB接続を Writer/Reader に分散しているが、エンドポイントが一つになる分散していない環境から試し始めたインスタンス型からサーバレス型に切り替えるにはスナップショット経由のみ作成に結構かかった。2~3時間くらいテスト環境とかから試し始めた。本番を切り替える場合どうしようかな。暗号化が必須特に影響なかった「すぐに適用」機能がコンソール上から使えないクラスター名の変更などメンテナンスウィンドウで変更となるCLI からのみ対応可能取り急ぎ再作成とかしたんで、メンテナンスウィンドウもコンソール上から変更できないサポートに聞いたらバックアップウィンドウと共に変更不可との事適応するしかないかサクッと試しただけでも色々と出ました。現状では ACU に上限がありますし、スケールアウト用のレプリカ機能もないのでオートスケール感度によっては本番に適用するのは難しい環境もありそうです。ただ、用途や制限を踏まえてマッチする環境であれば積極的にサーバレス版に切り替えていくべきアップデートかと感じました!皆さんもサーバレス推進するために本機能をガンガン使っていきましょー。それでは、また。
  • テクログ

    Amazon Rekognition でサクッと画像解析する!

    皆さん、AWS使ってますか? 今回は 「Amazon Rekognition(レコグニション)」 を紹介したいと思います! 最近バズワードでなくなりつつある AI 系サービスです! 「画像や動画の分析を簡単な API で使っちゃおう!当然サーバレスで!」 みたいな感じです。 主な機能は、  ・画像内の物体、概念、シーンにラベルを付与 ・アダルトコンテンツかを検出 ・どんな顔をしているかを分析 ・有名人かどうかを判定 ・顔が似ている割合を確認 ・画像内のテキストを抽出 ・動画内の物体、人物などを検出 など多岐に渡ります。 料金も非常に安く環境の構築や運用も不要なので、気軽に試せるかと思います。 当社が管理しているサイトでは、ユーザーが画像や動画を投稿するコンテンツがあるので、それらを分析するロジックに活用できないか検討しているところです。 皆さんも是非お試しください! それではまた!