App Engineerの開発ノート

AWS、Flutterや開発活動に役立つツール作りなど

Indexing APIではてなブログ記事のインデックス登録を自動化

f:id:Simoroid:20211001014154p:plain
自動でGoogle Search Consoleはてなブログ記事をインデックス登録する方法です。
インデックス登録が行われなければGoogle 検索によってブログが表示されません。

インデックスの登録はサイトマップを送信することでGoogleにより実施される仕様とのことですが、はてなブログではそのクロールが中々されずインデックス登録されないことがあるらしいです。

簡単な対応方法はSearch Console(Google Search Console)
でブログ記事のURLを直接入力し、インデックス登録をリクエストすることです。
ただ、記事を書くたびにそんな作業を毎回やりたくないのでツールを作って自動化します。

■ツール概要

1.まず始めに記事のURLを取得します。
先日作成した記事の一覧を抽出するツールを使用します。
ikodatech.com
2.Indexing APIを使用して1.で取得したURLに対してインデックス登録リクエストします。

今回ツールはpython(anacondaを使用)で実装します。

■ツール実装

0.下記よりIndexing APIを使用するための準備を行います。
https://developers.google.com/search/apis/indexing-api/v3/prereqs?hl=ja

1.先日作成した記事の一覧を抽出するツール(ps1ファイル)を用意します。

2.同フォルダに下記のpythonファイルを下記で作成します。
尚、必要なモジュールは下記辺りでダウンロード可能です。
https://anaconda.org/conda-forge/google-auth
https://anaconda.org/conda-forge/google-api-python-client
https://anaconda.org/conda-forge/httplib2

from google.oauth2 import service_account
from googleapiclient.http import BatchHttpRequest
from googleapiclient.discovery import build 
import httplib2
import os

# 0.で取得できるjsonファイルです。
JSON_KEY_FILE = "XXXX.json"
SCOPES = [ "https://www.googleapis.com/auth/indexing" ]

credentials = service_account.Credentials.from_service_account_file(
    JSON_KEY_FILE, scopes=SCOPES)

service = build('indexing', 'v3', credentials=credentials)

def insert_event(request_id, response, exception):
    print(response	)
    print(request_id)
    if exception is not None:
       # Do something with the exception
       pass
    else:
       # Do something with the response
       pass

# "output_articles.ps1"は1.で用意したps1ファイルです。
os.system('powershell -Command' + ' ' +\
          'powershell -ExecutionPolicy RemoteSigned .\\output_articles.ps1 > articles.txt')
articles_list = [] 
with open('./articles.txt') as f:
    for line in f:
       articles_list.append(line.replace("\n",""))

batch = service.new_batch_http_request(callback=insert_event)

for item in articles_list:
	batch.add(service.urlNotifications().publish(
    body={"url": item , "type": "URL_UPDATED"}))

batch.execute()
■ツール実行

pythonファイルを実行
f:id:Simoroid:20211001011812p:plain
⇒リクエストが完了しました。
尚、リクエストなので即時反映される訳ではありません。
翌日あたりにSearch Consoleを覗きにいくと下記のように登録に成功しています!
f:id:Simoroid:20211001011803p:plain

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

はてなブログの記事一覧をPowerShellだけでお手軽に抽出

f:id:Simoroid:20210929002308p:plain
自分がはてなブログ作成した記事の一覧を抽出するための方法です。
スクレイピングするやり方も一つの手だと思いますが、PowerShellだけでサクッとやることが出来ました。

記事の一覧はブログに紐づくサイトマップを参照することで参照可能です。
自分のはてなブログサイトマップは「https://ikodatech.com/sitemap.xml」のような形式でアクセス可能です。
※100記事以上ある場合にurlの形式が変わってくるようなのですが、とりあえず無視します。

■ツール実装
下記を張り付けて任意のファイル名(拡張子がps1)で保存。

# サイトマップのURLを指定
$url = 'https://ikodatech.com/sitemap.xml'
$res = Invoke-WebRequest $url
$xmlObj = [xml]$res.Content

foreach($sitemap in $xmlObj.sitemapindex.sitemap){
	$res = Invoke-WebRequest $sitemap.loc
	$locObj = [xml]$res.Content
	
	foreach($urlset in $locObj.urlset){
		# 静的ページを省くためフィルタを適用
		if($urlset.url.loc -like "*/entry/*"){
			echo $urlset.url.loc
		}
	}
}
pause

■実行
ツールを右クリック->「PowerShellで実行」をクリックで実行

f:id:Simoroid:20210929001413p:plain
f:id:Simoroid:20210929001422p:plain

こんな感じでとれましたー

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

DynamoDBへのデータ登録を楽にする

f:id:Simoroid:20210928002145p:plain
DynamoDBへのデータ登録を簡易化するためのツールを作ります。
BatchWriteItemというcommandを使用することで一括のデータ登録ができます。
batch-write-item — AWS CLI 1.20.48 Command Reference

今回は上記commandに使用するインプットデータ(jsonファイル)を自動生成します。
ツールはPowershellを使用します。

■ツールの概要
ツールでインプットデータを生成する元データは出来れば設計書を流用し、
新たな加工の手間が無く、そのまま使用できれば理想的かと思います。
f:id:Simoroid:20210928000012p:plain

今回はエクセルファイルを元データとして、
シート単位にテーブルの登録したい情報を記載しておけば、
インプットデータが生成できるツールとします。

■前提条件

PowershellExcelオブジェクトを使用する為、
Excelがインストールされている環境である必要があります。
ExcelがインストールされていなくてもClosedXMLという代替えのモジュールが
ありますが、それはまた別途記載します。

また、現状の仕様ではサポートしている型はBOOLとS(文字列)、N(数値)のみになります。※将来的には全ての型をサポートしたいが一旦上記の型のみで個人的には満足しています。

■実装方法

ソースコードのボリュームが結構おおきくなったので、
実装方法の説明は省略します。とりあえずコピペでps1ファイルで保存します。

■使用方法

1.ツールと"data"フォルダを任意フォルダに配置します。
f:id:Simoroid:20210928000039p:plain

2."data"フォルダに下記のようなエクセルファイルを配置します。
※形式を変えると動かなくなるので要注意
f:id:Simoroid:20210928000118p:plain

3.ツールを右クリック->「PowerShellで実行」をクリックで実行
⇒下記のようにA列で指定したデータセットID名でjsonファイルが出来上がる。

f:id:Simoroid:20210928000129p:plainf:id:Simoroid:20210928000139p:plain

4.下記aws cliを使用してデータ登録
一番最後の引数にツールで出力されたjsonファイルを指定します。

aws dynamodb batch-write-item --request-items file://Dataset-001.json

f:id:Simoroid:20210928000157p:plain

AWSコンソール上で結果を表示します。
f:id:Simoroid:20210928000206p:plain

エクセルファイルのシート名にしたテーブルにデータがちゃんとデータ登録されています!

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

【AWS便利ツール】DynamoDBのテーブルをCSVでエクスポートする

f:id:Simoroid:20210906012742p:plain
DynamoDBの内容をエクスポートしたい場合、テーブルの中身を簡易的にエクスポートする方法です。
ツールの開発にはPowerShell を使用します。
DynamoDBの管理コンソールからでもエクスポートは可能ですが、
わざわざログインしたくないときなどに便利です。

■前提条件

AWS CLI が使用できる必要があります。
下記手順からインストールが可能です。
AWS入門~CLIを使用してAWSにアクセス - App Engineerの開発ノート

PowerShellスクリプトファイルを実行できる権限が振られている必要があります。

■ツール準備

下記のソースをコピーして任意のps1ファイルを作成します。
※例:「output-csv.ps1」

# 接続先は適宜切り替え
$ENDPOINT_URL = "http://localhost:4566"
$OUTPUT_FORMAT = "json"

$tableName = Read-Host “テーブル名を入力してください。”
$jsonObj = aws dynamodb scan --table-name "$tableName" --endpoint-url $ENDPOINT_URL --output $OUTPUT_FORMAT
$obj = ($jsonObj | ConvertFrom-Json)
$obj.items | convertto-csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file "dump_$tableName.csv" -Encoding default

上記ファイルを任意ディレクトリに配置します。

■ツール実行

ツールのテスト用にデータを準備します。
今回は雑に"test"というテーブルに1レコードだけputしてます。
f:id:Simoroid:20210916004706p:plain

準備ができたら、配置したps1ファイルを右クリック -> "Powershellで実行"をクリック
で簡単に実行できます。
実行後はテーブルを名を入力します。
f:id:Simoroid:20210916003952p:plain
f:id:Simoroid:20210916004121p:plain
下記のようにエクスポートできました!
f:id:Simoroid:20210916004231p:plain

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

【AWS入門】Javaで始めてのLambdaアプリ開発

f:id:Simoroid:20210914010252p:plain
AWSのLambdaアプリをJavaで開発します。
とりあえずシンプルなものを実行できるところまで環境を整える手順です。
統合開発環境Intellijを使用します。

0. JDKをダウンロード

AWSと連携を可能にしたAmazon Corretto(JDK)をダウンロードします。
https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html

下記コマンドで入力されたことを確認

 java -version
openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.12.7.1 (build 11.0.12+7-LTS, mixed mode)

1. Gradleをダウンロード

 1. 以下より、binaryファイルをDL
  https://gradle.org/releases/
 2. DLしたファイルを解凍し、任意のディレクトリに配置
 3. 下記例のように環境変数を設定

操作 環境変数 追加・更新パス
追加 GRADLE_HOME C:\gradle-6.9.1
更新 PATH C:\gradle-6.9.1\bin


 4. 確認

gradle --version

2. gitのインストール

 1.以下よりダウンロード
  https://git-scm.com/

 2.確認

git --version

3. AWS CLIのインストール

下記記事の手順にてインストールを行います。
  ikodatech.com

4. IDEのインストール

下記からIntellijのCommunity版をダウンロード、インストールを行います。
https://www.jetbrains.com/ja-jp/idea/download/#section=windows
f:id:Simoroid:20210914001251p:plain

5. IDEプラグインを追加

IDEAWSに関する操作を実施できるプラグインAWS Toolkit for JetBrains」を導入します。
Plugins(プラグイン)でawsで検索し、表示されたAWS Tookitのインストールを実行
f:id:Simoroid:20210914001331p:plain
f:id:Simoroid:20210914001416p:plain

6. gitからソースを取得

下記は公式のドキュメントですが、Javaを使用したLambda開発に関して書かれており、
java-basic」というJavaを使用した最小の機能をもったアプリのソースがあります(Hello Worldレベルのアプリ)
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-samples.html

git clone https://github.com/awsdocs/aws-lambda-developer-guide.git

7. IDEで開く

File -> Open から3.で落としてきたフォルダから「aws-lambda-developer-guide/sample-apps/java-basic」
を開きます。
開くときにビルドツールの設定を迫られたら"Gradle project"を選択しましょう。
f:id:Simoroid:20210914001456p:plain

8. ビルド

IDE右側にある、GradleからTasks -> buildを開き「build」をダブルクリックでビルドを実行する。
f:id:Simoroid:20210914001652p:plain
上手くいけば下記のように成功のメッセージが出力されます。
f:id:Simoroid:20210914001719p:plain

9. 実行

Handler.javaを開くとLambdaアイコンが表示されているのでそれをクリックし「Run~~」を選択。
「Modify Run~~」を開きInput のテキストボックスにパラメータが入力できるが今回のサンプルアプリでは、
不要なので空の"{}"を入力しておく。
"AWS Conncection"タブから任意のCredentialsを選択
"OK"ボタンをクリック
f:id:Simoroid:20210914001832p:plain
f:id:Simoroid:20210914001913p:plain
ローカルで動作させる分には”aws configure”で適当な値を入力してプロファイルを作成しておけばよいです。
f:id:Simoroid:20210914002024p:plain
※もしかしたらdockerをインストールしておかなければ実行できない可能性があります。
dockerは下記にてインストール手順を記載しています。
AWS入門~localstackでローカル開発環境を準備する - App Engineerの開発ノート

f:id:Simoroid:20210914002228p:plain
上手くいけばログや実行結果がコンソールに表示されます。

これで実際のサーバーにアップしなくてもある程度の開発できそう。

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

AWS入門~CLIを使用してAWSにアクセス

f:id:Simoroid:20210910002135p:plain

コンソール上でコマンドを叩いてAWSのサービスにアクセスする方法です。
DBへのデータ登録等、開発を行う上で必要になるはずです。

尚、AWSのアカウント準備自体は下記から実施できます。
ikodatech.com

■インストール

AWS CLIAWS SAM CLIの二種類をインストールします。

  画面右側にインストーラーのリンクがあります。
  https://aws.amazon.com/jp/cli/
  ちなみにバージョン2と1があります。
  ・version2(https://awscli.amazonaws.com/AWSCLIV2.msi)
  ・version1(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html)
  

  下記でインストール可能です。
  https://github.com/aws/aws-sam-cli/releases/latest/download/AWS_SAM_CLI_64_PY3.msi

■確認

下記でインストールされたことを確認可能です。

aws --version
aws-cli/1.16.188 Python/3.6.0 Windows/10 botocore/1.12.178
sam --version
SAM CLI, version 1.31.0
■プロファイル作成

下記にAWS上アクセスしてプロフィールを作ります。
https://console.aws.amazon.com/iam/

 1."ユーザーを追加"をクリック
 2."ユーザー名"に任意の名前を入れて"プログラムによるアクセス"にチェックを入れる
 3."ユーザーの作成"をクリック
 4.アクセスキーとシークレットキーをメモする
f:id:Simoroid:20210906233655p:plainf:id:Simoroid:20210906233738p:plain
f:id:Simoroid:20210906233815p:plainf:id:Simoroid:20210909233259p:plain
 5. 4でメモした設定値を用いて下記コマンドの実行します。
  またリージョン名は存在するリージョンであれば何でも構いませんので"us-west-2"を設定します。出力形式はjson や textをお好みで設定可能です※"test"の部分は任意で構いません。

aws configure --profile test
AWS Access Key ID [None]: XXXX
AWS Secret Access Key [None]: YYYY
Default region name [None]: us-west-2
Default output format [None]: json
■確認

サンプルコマンドを使用してインストールされたことを確認します。

aws s3 ls --profile test

すると下記のエラーに遭遇してしましました、、

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

どうやら追加したユーザーに権限が足りていなかったようです。
権限の付与を行います。
1.作成したユーザーをクリック
2."アクセス権限の追加"をクリック
f:id:Simoroid:20210906233950p:plainf:id:Simoroid:20210906234046p:plain
3."グループの作成"をクリック
4."AdministratorAccess"をチェック※これは権限が強すぎるので実際に使う際は要注意
f:id:Simoroid:20210906234116p:plainf:id:Simoroid:20210906234149p:plain
5."グループの作成"をクリック
6."アクセス権限の追加"をクリック
f:id:Simoroid:20210906234230p:plainf:id:Simoroid:20210906234310p:plain
⇒権限の付与に成功しました。

再度挑戦します。

aws s3 ls --profile test
2021-07-23 11:56:30 elasticbeanstalk-us-east-2-575855985359

無事にCLIが使用したAWSへのアクセスに成功しました。

■参考サイト

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

AWS入門~localstackでローカル開発環境を準備する

f:id:Simoroid:20210902234753p:plain
AWS開発の必須ツールといっても過言ではないlocalstack
を使用することでローカル環境でdynamoDBやLambdaなど様々なサービスの
開発を行うことが出来ます。


1.PC上の設定変更
タスクバーの検索ボックスに「Windowsの機能の有効化または無効化」と入力しメニューを開き"Hyper-V"にチェックを付ける。
Windows 10 Pro の時のみ必要な手順

2.Dockerをインストール
下記の"Get Docker"をクリックします。
https://hub.docker.com/editions/community/docker-ce-desktop-windows/?tab=reviews

3.インストール
基本的にインストーラーを開き「Insall required Windows components for WSL2」にチェックが入ってることを確認し、
ボタンを押し進めていき、言われるがままにPC再起動していくだけです。
※再起動後、Linux カーネル更新プログラム パッケージのダウンロードを促されることがあるので、案内に従い更新を行う。

f:id:Simoroid:20210825005530p:plainf:id:Simoroid:20210825005141p:plain

4.確認
Powershellコマンドプロンプトでも可)で下記コマンドを使用してバージョン情報の確認。

docker --version
docker-compose --version

5.localstackのDockerイメージをダウンロード
dockerのイメージをダウンロードする必要があります。
ダウンロード方法は色々あり、docker hub ※1 というものを利用して導入することも可能ですが、
gitからcloneしてくるのが個人的には楽に感じます。
※1 docker hubを利用した方法(https://dev.classmethod.jp/articles/stepfunctionslocal-localstack/)

git clone https://github.com/localstack/localstack.git

起動するイメージのバージョンを固定したい場合は"docker-compose.yml "というファイルを下記のように書き換え。
image: localstack/localstack → image: localstack/localstack:0.12.17

6.起動
cloneしてきたディレクトリ内の"docker-compose.yml"というファイルが
あるディレクトリへ移動し、Powershellで以下のコマンド実行。

docker-compose up

f:id:Simoroid:20210825005057p:plain
赤枠に記載されたポートを確認し、
任意ブラウザで「http://localhost:XXXX/」にアクセス。
無事に起動できたことが確認できます。
f:id:Simoroid:20210825005108p:plain

7.終了
Ctrl + C で終了します。焦って連続で押すと強制終了みたいになってあまりよくないかもです。

これ以降はlocalstackを使用した開発もやりたいと思います。


ここまで 読んで頂きありがとうございました。
よければフォローお願いします!