📖 AWS記事まとめ
「 AWSに データベース サーバーってどうやっておくんだぜ?」
「 Key Value 型のデータベースか。使ったこともないな」
「 👆 AWS公式の動画を見るのは うんざりしたので 他人の記事へ」
「 👆 なんのこっちゃ分からん。 触って失敗して覚えていこうぜ」
「 👆 何をしたらいいのか分からないし、動画をみるのは おぞましいぜ」
「 👆 とにかく いじるしか進まない。 動画は見たくないからな」
「 👆 自分が何をやっているのか分からないぜ。 でも動画は見たくないぜ」
📖 Python および DynamoDB を使用する開発方法
「 👆 DynamoDB をローカルにダウンロードして チュートリアルしろってことみたいよ?」
📖 DynamoDB ローカル (ダウンロード可能バージョン) のセットアップ
📖 コンピュータ上で DynamoDB をローカルでデプロイする
「 👆 Windows なんで .zip ファイルをダウンロードするぜ。 Java なんか入れたくないけど」
「 👆 は~。 Java が自動でインストールされる様子もないぜ」
「 👆 この画面で止まってしまった。嫌になった。 もう寝る」
「 👆 自分が何をやらされているのか分からないが、ページを開いて読むしかないぜ」
事前にアクセスキー ID とシークレットアクセスキーを取得する必要があります。
「 👆 AWS CLI を使う前に、 アクセスキーID
と シークレットアクセスキー
が必要みたいよ?」
自身用のアクセスキーを持つ新しい管理者 IAM ユーザーを作成します。
「 👆 そのページを読む前に、 自身用のアクセスキーを持つ新しい管理者 IAM ユーザー
の作成が必要だそうよ?」
「 お父んは 管理者 IAM ユーザー は前に作ったのでは?」
「 👆 この画面にたどりついたが、何をしたらいいのか分からないぜ」
「 👆 IAM
というサービスの ユーザー
というページを目指すぜ」
「 👆 なんだか よく分からないが、 アクセスキーの作成
というボタンを押してみようぜ?」
「 👆 メモ取るの めんどくさいんで .csv ファイルをダウンロードするぜ。
.csv の中には、上図の下にあるテーブルのようなものが英語で入っていたぜ」
「 👆 じゃあ AWS CLI とかいう変な名前の何かをインストールしなさいよ」
「 Visual Studio Code をすべて閉じてから もう一度試せだぜ」
「 👆 おおーっ インストールできてたけど 設定できてないぜ」
📖 Configuration and credential file settings
aws configure
「 👆 こういうコマンドを打てばいいのか。あとはやっとくぜ。
分からんところは 空打ちでいいだろ」
「 your region
を configure
しろと尋ねられるが、何を入れたらいいんだぜ?」
「 output format はサンプルを参考に json
にするかだぜ」
aws dynamodb create-table \
--table-name Music \
--attribute-definitions \
AttributeName=Artist,AttributeType=S \
AttributeName=SongTitle,AttributeType=S \
--key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
「 👆 なんだか分からんが、サンプルをそのまま 貼り付けようぜ!」
aws dynamodb create-table ^
--table-name Music ^
--attribute-definitions ^
AttributeName=Artist,AttributeType=S ^
AttributeName=SongTitle,AttributeType=S ^
--key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE ^
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
「 👆 Microsoft は UNIXをそのまま真似ずに 記号をチョコチョコ変える真似をしていて、 \
の代わりに ^
を使うんだぜ」
「 じゃあ AWS CLI
を使って テーブルを作れたのか」
aws dynamodb put-item ^
--table-name Music ^
--item ^
'{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}}' ^
--return-consumed-capacity TOTAL
「 コマンドラインのダブルクォーテーションの扱いでは、 JSON のダブルクォーテーションとか 認識しないのでは?」
「 Microsoft のコマンドラインに JSON を打てない!?」
aws dynamodb put-item --table-name Music --item '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}}' --return-consumed-capacity TOTAL
「 サンプルには続きがあって、JSONファイルを作って ファイルパスを指定すればいいのよ」
key-conditions.json:
{
"Artist": {
"AttributeValueList": [
{
"S": "No One You Know"
}
],
"ComparisonOperator": "EQ"
},
"SongTitle": {
"AttributeValueList": [
{
"S": "Call Me Today"
}
],
"ComparisonOperator": "EQ"
}
}
aws dynamodb query --table-name Music --key-conditions file://key-conditions.json
「 それは query
であって、 put-item
ではないのでは?」
item.json:
{
"Artist": {
"S": "No One You Know"
},
"SongTitle": {
"S": "Call Me Today"
},
"AlbumTitle": {
"S": "Somewhat Famous"
}
}
aws dynamodb put-item ^
--table-name Music ^
--item file://item.json ^
--return-consumed-capacity TOTAL
aws dynamodb query --table-name Music --key-conditions file://key-conditions.json
「 この前 ローカルでテストするといってダウンロードした dynamodb_local_latest
は いつ使うの?」
「 コマンドラインではなく、 Python で取得できないのかだぜ?」
📖 ステップ 1: Python を使用してテーブルを作成する
import boto3
pip install boto3
python MoviesCreateTable.py
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "http://localhost:8000/"
「 👆 この前の dynamodb_local_latest
が ポート 8000 番だったから、サーバーとして使えんじゃないの?」
「 AWSのサンプルを続けていくぜ。
でかい JSON ファイルを .zip でダウンロードして解凍、 Pythonスクリプトで データベースに追加していくぜ」
「 Python 3.7.6 では動かないコードがでてきた……」
「 👆 Python をどこにインストールしたか覚えないから、パスを撮っておかないと」
「 Python 7 と Python 10 が混ざって 7 になるぜ」
「 ダメだったぜ。 Microsoft Store からインストールしたろ。不便になったな」
📖 Summary
「 テーブルを作ると言っても、どんなものを作れるのか分からんなあ」
「 Partition key
とか、 Sort key
とか なんのことやら」
「 Partition key
は 主キー(Primary key
)みたいなもんらしいぜ。
Sort key
も 主キーの2つ目ぐらいのもんだろ」
「 AttributeName
は 列名(Column name
)ぐらいの意味かしらねぇ」
「 Partition key
と Sort key
に固定のものじゃないか?」
e_gov_create_bestmove_table.py:
"""
python.exe e-gov-create-bestmove-table.py
"""
import boto3
def create_table(dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.create_table(
# テーブル名
TableName='Bestmove',
# キー列の設定
KeySchema=[
{
'AttributeName': 'yourName',
'KeyType': 'HASH' # Partition key
},
{
'AttributeName': 'secret',
'KeyType': 'RANGE' # Sort key
}
],
# キー列定義(通常列は書きません)
AttributeDefinitions=[
{
'AttributeName': 'yourName',
'AttributeType': 'S'
},
{
'AttributeName': 'secret',
'AttributeType': 'S'
}
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
return table
if __name__ == '__main__':
bestmove_table = create_table()
print("Table status:", bestmove_table.table_status)
「 Create table
するときは キー列 だけを書いて、通常の列は書かないらしいぜ」
📖 How to Add a Column in DynamoDB
「 二次元の表ではないのではないか? XML構造なのでは?」
e_gov_put_bestmove_item.py:
"""
python.exe e-gov-put-bestmove-item.py
"""
from pprint import pprint
import boto3
def put_bestmove(your_name, secret, bestmove, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Bestmove')
response = table.put_item(
Item={
'yourName': your_name,
'secret': secret,
# 'S'(文字列型)の 'bestmove' 属性を追加
'bestmove': {'S', bestmove}, # 間違い。'bestmove': bestmove, が正しい
}
)
return response
if __name__ == '__main__':
movie_resp = put_bestmove("Muzudho", "abc1234", "+7776FU")
print("Put movie succeeded:")
pprint(movie_resp, sort_dicts=False)
「 テーブルの中を見るダッシュボードみたいなソフトないの?」
e_gov_get_bestmove_item.py:
"""
python.exe e-gov-get-bestmove-item.py
"""
from pprint import pprint
import boto3
from botocore.exceptions import ClientError
def get_bestmove(your_name, secret, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Bestmove')
try:
response = table.get_item(Key={'yourName': your_name, 'secret': secret})
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response['Item']
if __name__ == '__main__':
movie = get_bestmove("Muzudho","abc1234")
if movie:
print("Get movie succeeded:")
pprint(movie, sort_dicts=False)
「 👆 キーを使って1件取るのはできるけど、集計したいんだぜ」
📖 DynamoDBをPython(boto3)を使って試してみた
「 👆 Scan
というのがあるみたいだが、料金も高く付くらしいぜ」
e_gov_scan_bestmove_table.py:
"""
python.exe e-gov-scan-bestmove-table.py
"""
from pprint import pprint
import boto3
from botocore.exceptions import ClientError
def scan_bestmove(dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Bestmove')
try:
response = table.scan()
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response
if __name__ == '__main__':
all_data = scan_bestmove()
if all_data:
print("Scan bestmove table succeeded:")
pprint(all_data, sort_dicts=False)
Output:
C:\GitHub\dynamodb-practice>python.exe e-gov-scan-bestmove-table.py
Scan bestmove table succeeded:
{'Items': [{'yourName': 'Kifuwarane',
'bestmove': {'S', '+5958OU'},
'secret': 'bebebebebeYOYOYOYOYO'},
{'yourName': 'Muzudho',
'bestmove': {'+7776FU', 'S'},
'secret': 'abc1234'},
{'yourName': 'Kifuwarazusa',
'bestmove': {'+5756FU', 'S'},
'secret': 'bababababa00'}],
'Count': 3,
'ScannedCount': 3,
'ResponseMetadata': {'RequestId': '3056f101-176b-41cd-aaa8-133a7b060a56',
'HTTPStatusCode': 200,
'HTTPHeaders': {'date': 'Thu, 18 Nov 2021 12:16:31 GMT',
'content-type': 'application/x-amz-json-1.0',
'x-amz-crc32': '3609194069',
'x-amzn-requestid': '3056f101-176b-41cd-aaa8-133a7b060a56',
'content-length': '328',
'server': 'Jetty(9.4.18.v20190429)'},
'RetryAttempts': 0}}
「 テーブルの中身を空っぽにするには どうやるんだぜ? Truncate table
は無いのかだぜ?」
「 1行削除するのも料金かかるから、テーブルを削除して テーブルを作成しなおすのが ベストプラクティスのようよ」
e_gov_delete_bestmove_table.py:
"""
python.exe e-gov-delete-bestmove-table.py
"""
import boto3
def delete_bestmove_table(dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Bestmove')
table.delete()
if __name__ == '__main__':
delete_bestmove_table()
print("Bestmove table deleted.")
「 👆 じゃあ、 エンドポイントを AWS に合わせればクラウドアプリとして使えるんだろ。
次は 一番得票の多い指し手を1つ選ぶプログラムを作ってくれだぜ」
「 👆 Scan
で こんなデータが撮ってくれるから、 Items
で アイテムの配列が取れそうだよな」
{'S', '+5958OU'}
e_gov_bestmove_py:
"""
python.exe e_gov_bestmove.py
"""
from pprint import pprint
from e_gov_scan_bestmove_table import scan_bestmove_table
def get_bestmove():
item_list = scan_bestmove_table()
if item_list:
print("Scan bestmove table succeeded:")
pprint(item_list, sort_dicts=False)
move_dict = {}
for item in item_list:
# move
m = item['bestmove']
if m in move_dict.keys():
move_dict[m] += 1
else:
move_dict[m] = 1
max_key = None
max_value = 0
for key, value in move_dict.items():
if max_value < value:
max_key = key
max_value = value
print(f"max_key=[{max_key}] max_value=[{max_value}]")
return max_key
if __name__ == '__main__':
# move
m = get_bestmove()
print(f"bestmove=[{m}]")
e_gov_bestmove_py:
"""
python.exe e_gov_bestmove.py
"""
import random
from pprint import pprint
from e_gov_scan_bestmove_table import scan_bestmove_table
def get_bestmove():
item_list = scan_bestmove_table()
if item_list:
print("Scan bestmove table succeeded:")
pprint(item_list, sort_dicts=False)
move_dict = {}
for item in item_list:
# move
m = item['bestmove']
if m in move_dict.keys():
move_dict[m] += 1
else:
move_dict[m] = 1
max_key_list = []
max_value = 0
for key, value in move_dict.items():
if max_value < value:
max_key_list = [key]
max_value = value
elif max_value == value:
max_key_list.append(key)
print(f"max_value=[{max_value}] max_key_list=[{max_key_list}]")
return random.choice(max_key_list)
if __name__ == '__main__':
# move
m = get_bestmove()
print(f"bestmove=[{m}]")
📖 [第一部]これならわかる!Flask+Nginx+uWSGIをAWSに丁寧にデプロイ
「 じゃあ Python Flask だけでも先に作りましょう」
📖 muzudho/e-gov-vote-python-flask
「 投票のPythonスクリプトも実装してしまえばどうだぜ?」
「 👆 全部 Python で書いてるので 簡単に組み込めた」
「 *.pem
ファイルを大事に持っとけというけど、どのディレクトリーに置いておけばいいんだぜ?」
📖 AWSのSSH接続で少しつまづいた所 .pemファイルあたり
C:\Users\<ユーザー名>\.ssh
「 👆 Windows ターミナルでそのディレクトリーへ移動するぜ」
ssh-add ./<PEM名>.pem
Output:
Error connecting to agent: No such file or directory
「 Windows に ssh-add
なんて洒落たもの無いのでは?」
その1
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?
「 ポート開いて Nginx uWSGI を設定するところから始めるの?」
記事を移動しました。
📖 AWS EC2のインスタンスにDockerをインストールするにはどうやったらいいんだぜ(^~^)?
「 じゃあ お父んのローカルPCで Docker コンテナを作れだぜ」
「 👆 まえに nngs-docker を作ったことがある。参考にしろ」
📖 nginx-uwsgi-flask-hello-world
「 それ nginx uWSGI Flask じゃないんで、別のやつで」
「 あれ? わたしのPC Docker がインストールされてない?」
📖 Install Docker Desktop on Windows
「 docker
はインストールできたけど、 docker-compose
はインストールされてないぜ?」
「 👆 Docker Desktop に同梱されてるそうよ」
「 スモークテストはok。 これをベースに 世界政府きふわらべ を移植しようぜ?」
「 👆 エラーハンドリングも覚えたぜ。 ほんとは エラーの内容を表示すると クラッカーに狙われるからダメなんだけど」
「 👆 Docker環境に クレデンシャルを置く方法 どうやるんだぜ?」
「 👆 docker-compose.yaml
ファイルでマウントする方法があった気もするが忘れたんで そろそろ寝る」
📖 What is the best way to pass AWS credentials to a Docker container?
📖 AWS CLI を使用して Amazon S3 バケットに接続する際に発生する「認証情報が見つかりません」というエラーを修正する方法を教えてください。
aws configure list
「 👆 ローカルPCの AWS のクレデンシャルファイルを探す方法はこれでいいんだぜ」
「 Dockerコンテナに AWS をインストールするところからなの?」
📖 docker - cannot find aws credentials in container although they exist
ls -l ~/.aws/config
Output:
ls: cannot access '/root/.aws/config': No such file or directory
# sudo su -
/bin/sh: 3: sudo: not found
「 👆 Docker コンテナの中のわたしにルート権限無いの?」
pwd
/usr/local/var/log
su -
pwd
/root
cd /
ls
app bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
cd app
ls
LICENSE README.md __pycache__ docs e_gov_put_bestmove_item.py static templates uwsgi.ini webapp.py
# cd ~
# ls -a
. .. .bash_history .bashrc .cache .profile .python_history .wget-hsts
exit
docker-compose down
# TODO クレデンシャルファイルをマウント
volumes:
- C:/Users/むずでょ/.aws/credentials:/home/app/.aws/credentials:ro
「 👆 これでマウントできてるんだが、 /home/app
なんかに置いてていいのかだぜ?」
「 /root/.aws/credentials
ディレクトリに置いたらどうだぜ?」
「 待てだぜ。 boto3
はどのディレクトリをデフォルトと思って読みに行くんだぜ?」
4. Shared credential file (~/.aws/credentials)
「 ホームディレクトリの下に .aws
ディレクトリを作れだぜ」
# TODO クレデンシャルファイルをマウント
volumes:
- C:/Users/むずでょ/.aws/credentials:/root/.aws/credentials:ro
「 👆 こう書いても .aws
ディレクトリは作られてないぜ」
docker exec -it e-gov-vote-kifuwarabe-server-frontend-1 bash
Output:
root@d0f79a89857b:/usr/local/var/log#
「 👆 これで見ると /home/app/.aws
ディレクトリはあるぜ」
root@d0f79a89857b:/home/app# mv .aws /root
「 👆 コンテナの中でこうやって動かせば いいんだろうけど」
# TODO クレデンシャルファイルをマウント
volumes:
- C:/Users/むずでょ/.aws/credentials:/home/app/.aws/credentials:ro
# ↓ 機能しない?
# - C:/Users/むずでょ/.aws/credentials:/root/.aws/credentials:ro
「 ローカルPC ではそれでいいかもしれないが、 AWS EC2 の ubuntu の上ではどうするんだぜ?」
「 AWS EC2 の ubuntu に /root/.aws
ディレクトリーを作って置くしかなくない?」
📖 e-gov-vote-kifuwarabe-server
「 👆 じゃあ これを AWS EC2 に SSH で置きなさいよ」
その2
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?
「 👆 permission denied
が出て、ディレクトリを作ることもできないぜ」
「 その Dockerコンテナに どんなユーザーアカウントが登録されているんだぜ?」
cat /etc/passwd
📖 Linuxでユーザーの一覧や現在のユーザを確認する方法とは?
「 👆 ubuntu
ユーザーはいるけど、どんな権限を持たせたらいいんだぜ?」
「 トップ階層ではなく、ホームの下なら ディレクトリーを作れるんじゃないの?」
リンク
📖 AWS EC2のインスタンスにDockerをインストールするにはどうやったらいいんだぜ(^~^)?
リンク
📖 AWS EC2のインスタンスにdocker-composeをインストールする方法が分からないぜ(^~^)
その3
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?
「 👆 昨日は docker-compose
をインストールしたのに
コマンドが無いと言われるので どうしよう、
というところで終わったんだぜ」
📖 Docker-compose: /usr/local/bin/docker-compose : line 1: Not: command not found
「 👆 あれっ? Docker compose インストールされてないぜ?」
再掲リンク
📖 AWS EC2のインスタンスにdocker-composeをインストールする方法が分からないぜ(^~^)
「 👆 外側のOSが Windows ではなくて Ubuntu に変わったからな。
置き場所を考えないとな」
「 👆 docker-compose
コマンドが動きそうだぜ」
「 その仮想マシンに、外部からアクセスできる URL は何なの?」
「 それは AWS EC2 のインスタンスに割り振られた IPアドレスだろ」
「 ubuntu の Fire wall のポートを開けてよ」
📖 sudo ufw status return 'inactive'
$ ufw enable
ERROR: You need to be root to run this script
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ ufw status
ERROR: You need to be root to run this script
$ sudo ufw status
Status: active
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
$ sudo ufw status numbered
Status: active
$ sudo ufw allow 8080
Rule added
Rule added (v6)
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 8080 ALLOW IN Anywhere
[ 2] 8080 (v6) ALLOW IN Anywhere (v6)
「 👆 Connection refused
というのは、接続拒否なんだぜ。何かが意図的に接続を拒否してるんだぜ」
「 AWSのセキュリティ設定が、インスタンスの裁量に干渉しているそうよ」
「 👆 じゃあ ここでセキュリティ管理を一括してできるということかだぜ?」
「 👆 開いたけど……、じゃあ ubuntuの中の設定消しとこ」
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 8080 ALLOW IN Anywhere
[ 2] 8080 (v6) ALLOW IN Anywhere (v6)
sudo ufw delete 1
sudo ufw delete 2
$ sudo ufw status
Status: active
a e-gov 3.21.39.126
「 👆 Value Domain の DNS 設定で ワラベンチャードメインの Aレコードを設定」
その4
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?
「 結局 SSH接続できなかったんで t2.large インスタンスを停止」
「 メモリが 8GB では足りなかったのかも知らん、メモリが 16GBの t2.xlarge インスタンスを起動」
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!