2021-11-27に更新

AWSにデータベースサーバーってどうやって置くの(^~^)?

へぷーん(^~^) 公開下書き

記事ナビゲーション

📖 AWS記事まとめ

前提知識

📖 AWSってどうやってログインするんだっけ(^~^)?

本文

ramen-tabero-futsu2.png
「 AWSに データベース サーバーってどうやっておくんだぜ?」

kifuwarabe-futsu.png
「 投げればいいんじゃないか?」

📖 Amazon DynamoDB とは

ohkina-hiyoko-futsu2.png
「 👆 DynamoDB とかどうなの?」

ramen-tabero-futsu2.png
「 Key Value 型のデータベースか。使ったこともないな」

📖 DynamoDB (ウェブサービス) の設定

ramen-tabero-futsu2.png
「 👆 やるだけ やってみるかだぜ」

📖 【入門】DynamoDBの概要と使い方

ramen-tabero-futsu2.png
「 👆 AWS公式の動画を見るのは うんざりしたので 他人の記事へ」

20211108blog3.png

ramen-tabero-futsu2.png
「 👆 なんのこっちゃ分からん。 触って失敗して覚えていこうぜ」

20211108blog4.png

ramen-tabero-futsu2.png
「 👆 何をしたらいいのか分からないし、動画をみるのは おぞましいぜ」

20211108blog5.png

ramen-tabero-futsu2.png
「 👆 とにかく いじるしか進まない。 動画は見たくないからな」

20211108blog6.png

ramen-tabero-futsu2.png
「 👆 自分が何をやっているのか分からないぜ。 でも動画は見たくないぜ」

📖 Python および DynamoDB を使用する開発方法

ohkina-hiyoko-futsu2.png
「 👆 DynamoDB をローカルにダウンロードして チュートリアルしろってことみたいよ?」

ramen-tabero-futsu2.png
「 Webで動かなきゃ意味ないのに……」

📖 DynamoDB ローカル (ダウンロード可能バージョン) のセットアップ

ohkina-hiyoko-futsu2.png
「 👆 JRE が必要みたいよ?」

ramen-tabero-futsu2.png
「 Java なんか入れたくないのに……」

📖 コンピュータ上で DynamoDB をローカルでデプロイする

ramen-tabero-futsu2.png
「 👆 Windows なんで .zip ファイルをダウンロードするぜ。 Java なんか入れたくないけど」

20211108blog7.png

ramen-tabero-futsu2.png
「 👆 とりあえず解凍して 適当な場所に置くぜ」

20211108blog8.png

ramen-tabero-futsu2.png
「 👆 は~。 Java が自動でインストールされる様子もないぜ」

📖 Java in Visual Studio Code

ramen-tabero-futsu2.png
「 👆 調べるか」

20211108blog9.png

ramen-tabero-futsu2.png
「 👆 見たこともないインストーラーも 見飽きたぜ」

20211108blog10.png

ramen-tabero-futsu2.png
「 👆 なんか ごちゃごちゃ してきたな」

20211108blog11.png

ramen-tabero-futsu2.png
「 👆 この画面で止まってしまった。嫌になった。 もう寝る」

別の日

📖 AWS CLI の使用

ramen-tabero-futsu2.png
「 👆 自分が何をやらされているのか分からないが、ページを開いて読むしかないぜ」

事前にアクセスキー ID とシークレットアクセスキーを取得する必要があります。

ohkina-hiyoko-futsu2.png
「 👆 AWS CLI を使う前に、 アクセスキーID と シークレットアクセスキー が必要みたいよ?」

📖 AWS Access Key の取得

ramen-tabero-futsu2.png
「 👆 じゃあ このページも読むしかないぜ」

自身用のアクセスキーを持つ新しい管理者 IAM ユーザーを作成します。

ohkina-hiyoko-futsu2.png
「 👆 そのページを読む前に、 自身用のアクセスキーを持つ新しい管理者 IAM ユーザー の作成が必要だそうよ?」

kifuwarabe-futsu.png
「 お父んは 管理者 IAM ユーザー は前に作ったのでは?」

ramen-tabero-futsu2.png
「 名前もパスも 何も覚えてないぜ」

20211111blog12.png

ramen-tabero-futsu2.png
「 👆 この画面にたどりついたが、何をしたらいいのか分からないぜ」

20211111blog13.png

ramen-tabero-futsu2.png
「 👆 IAM というサービスの ユーザー というページを目指すぜ」

20211111blog14.png

ramen-tabero-futsu2.png
「 👆 認証情報 というタブを開くぜ」

20211111blog15.png

ramen-tabero-futsu2.png
「 👆 なんだか よく分からないが、 アクセスキーの作成 というボタンを押してみようぜ?」

kifuwarabe-futsu.png
「 何も分からないと言いながら進んでいく精神わらう」

20211111blog16.png

ramen-tabero-futsu2.png
「 👆 メモ取るの めんどくさいんで .csv ファイルをダウンロードするぜ。
.csv の中には、上図の下にあるテーブルのようなものが英語で入っていたぜ」

📖 AWS コマンドラインインターフェイス

ohkina-hiyoko-futsu2.png
「 👆 じゃあ AWS CLI とかいう変な名前の何かをインストールしなさいよ」

20211111blog17a1.png

ramen-tabero-futsu2.png
「 👆 こんなとこ クリックすんの?」

20211111blog18.png

ramen-tabero-futsu2.png
「 👆 じゃあ インストールしとくぜ」

20211111blog19.png

ramen-tabero-futsu2.png
「 👆 本当に インストールされてるのかだぜ?」

kifuwarabe-futsu.png
「 Visual Studio Code をすべて閉じてから もう一度試せだぜ」

20211111blog20.png

ramen-tabero-futsu2.png
「 👆 おおーっ インストールできてたけど 設定できてないぜ」

📖 Configuration and credential file settings

ohkina-hiyoko-futsu2.png
「 👆 このあたりの記事を読めばいいんじゃないの?」

aws configure

ramen-tabero-futsu2.png
「 👆 こういうコマンドを打てばいいのか。あとはやっとくぜ。
分からんところは 空打ちでいいだろ」

20211111blog21.png

ramen-tabero-futsu2.png
「 👆 こんなディレクトリーにファイルができていたぜ」

ramen-tabero-futsu2.png
「 your region を configure しろと尋ねられるが、何を入れたらいいんだぜ?」

20211111blog22.png

kifuwarabe-futsu.png
「 us-east-2 かなあ?」

ramen-tabero-futsu2.png
「 output format はサンプルを参考に json にするかだぜ」

20211111blog23.png

ramen-tabero-futsu2.png
「 👆 よっしゃ! コマンドが反応したぜ!」

📖 DynamoDB での AWS CLI の使用

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

ramen-tabero-futsu2.png
「 👆 なんだか分からんが、サンプルをそのまま 貼り付けようぜ!」

20211111blog24.png

ramen-tabero-futsu2.png
「 👆 ダメだぜ」

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

ramen-tabero-futsu2.png
「 👆 Microsoft は UNIXをそのまま真似ずに 記号をチョコチョコ変える真似をしていて、 \ の代わりに ^ を使うんだぜ」

kifuwarabe-futsu.png
「 迷惑だぜ」

20211111blog25.png

ramen-tabero-futsu2.png
「 👆 なんか動いたなあ、何か知らんけど」

20211111blog26.png

ohkina-hiyoko-futsu2.png
「 👆 music というテーブルが増えてるわよ?」

ramen-tabero-futsu2.png
「 じゃあ 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  

20211111blog27.png

ramen-tabero-futsu2.png
「 👆 あれっ? 動かね?」

kifuwarabe-futsu.png
「 コマンドラインのダブルクォーテーションの扱いでは、 JSON のダブルクォーテーションとか 認識しないのでは?」

ramen-tabero-futsu2.png
「 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

ramen-tabero-futsu2.png
「 👆 1行にしてもダメだぜ」

ohkina-hiyoko-futsu2.png
「 サンプルには続きがあって、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

20211111blog28.png

ramen-tabero-futsu2.png
「 👆 テーブルに項目が追加されている様子はないぜ」

kifuwarabe-futsu.png
「 それは 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  

20211111blog29.png

ramen-tabero-futsu2.png
「 👆 なんだか分からんが 項目に入ってるぜ」

kifuwarabe-futsu.png
「 入ってて 何が嬉しいんだぜ?」

aws dynamodb query --table-name Music --key-conditions file://key-conditions.json

20211111blog30.png

ramen-tabero-futsu2.png
「 👆 今度は 検索結果を取れたぜ」

ohkina-hiyoko-futsu2.png
「 この前 ローカルでテストするといってダウンロードした dynamodb_local_latest は いつ使うの?」

ramen-tabero-futsu2.png
「 さあ……?」

はたまた別の日

kifuwarabe-futsu.png
「 コマンドラインではなく、 Python で取得できないのかだぜ?」

📖 ステップ 1: Python を使用してテーブルを作成する

ramen-tabero-futsu2.png
「 👆 分からないから やろうぜ」

import boto3

ramen-tabero-futsu2.png
「 👆 ここでエラーになるぜ」

pip install boto3

📖 Installation

ohkina-hiyoko-futsu2.png
「 👆 パッケージをインストールすればいいのよ」

python MoviesCreateTable.py

ramen-tabero-futsu2.png
「 👆 じゃあ実行しよ」

ramen-tabero-futsu2.png
「 応答がないぜ」

kifuwarabe-futsu.png
「 タイムアウトを待てだぜ」

botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "http://localhost:8000/"

ramen-tabero-futsu2.png
「 👆 エンドポイントURLって何だぜ?」

20211111blog31.png

ohkina-hiyoko-futsu2.png
「 👆 この前の dynamodb_local_latest が ポート 8000 番だったから、サーバーとして使えんじゃないの?」

20211115blog32.png

ramen-tabero-futsu2.png
「 👆 なんか動きはしたぜ」

ramen-tabero-futsu2.png
「 AWSのサンプルを続けていくぜ。
でかい JSON ファイルを .zip でダウンロードして解凍、 Pythonスクリプトで データベースに追加していくぜ」

ramen-tabero-futsu2.png
「 Python 3.7.6 では動かないコードがでてきた……」

📖 【Windows】Pythonをアップデートする

ramen-tabero-futsu2.png
「 👆 Python のバージョンを上げたろ」

20211115blog33.png

ramen-tabero-futsu2.png
「 👆 Python をどこにインストールしたか覚えないから、パスを撮っておかないと」

ramen-tabero-futsu2.png
「 Python 7 と Python 10 が混ざって 7 になるぜ」

20211115blog34.png

ramen-tabero-futsu2.png
「 👆 古い方をアンインストールしてみるかだぜ」

ramen-tabero-futsu2.png
「 ダメだったぜ。 Microsoft Store からインストールしたろ。不便になったな」

20211115blog35.png

ramen-tabero-futsu2.png
「 👆 何をやってたか忘れたぜ」

ohkina-hiyoko-futsu2.png
「 項目を追加したのよ」

📖 Summary

ramen-tabero-futsu2.png
「 👆 最後まで読むと エンドポイントの説明もあったぜ」

またまた別の日

ramen-tabero-futsu2.png
「 テーブルを作ると言っても、どんなものを作れるのか分からんなあ」

ramen-tabero-futsu2.png
「 Partition key とか、 Sort key とか なんのことやら」

📖 【入門】私を苦しめたDynamoDB

kifuwarabe-futsu.png
「 Partition key は 主キー(Primary key)みたいなもんらしいぜ。
Sort key も 主キーの2つ目ぐらいのもんだろ」

ohkina-hiyoko-futsu2.png
「 AttributeName は 列名(Column name)ぐらいの意味かしらねぇ」

ramen-tabero-futsu2.png
「 KeyTypeHASH とか RANGE は?」

kifuwarabe-futsu.png
「 Partition keySort 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)

ramen-tabero-futsu2.png
「 Create table するときは キー列 だけを書いて、通常の列は書かないらしいぜ」

ohkina-hiyoko-futsu2.png
「 じゃあ 通常列はどうやって増やすの?」

📖 How to Add a Column in DynamoDB

ramen-tabero-futsu2.png
「 👆 行を追加したら、勝手に 列が増えるんじゃないか?」

kifuwarabe-futsu.png
「 二次元の表ではないのではないか? 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)

ramen-tabero-futsu2.png
「 👆 適当に書いたけど、いいのかだぜ?」

ohkina-hiyoko-futsu2.png
「 テーブルの中を見るダッシュボードみたいなソフトないの?」

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)

ramen-tabero-futsu2.png
「 👆 キーを使って1件取るのはできるけど、集計したいんだぜ」

📖 DynamoDBをPython(boto3)を使って試してみた

kifuwarabe-futsu.png
「 👆 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}}

ramen-tabero-futsu2.png
「 👆 はーん。全部取ってくるのかだぜ」

ramen-tabero-futsu2.png
「 テーブルの中身を空っぽにするには どうやるんだぜ? Truncate table は無いのかだぜ?」

ohkina-hiyoko-futsu2.png
「 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.")

ramen-tabero-futsu2.png
「 👆 Scan が効かなくなった。テーブルは消えたぜ」

kifuwarabe-futsu.png
「 👆 じゃあ、 エンドポイントを AWS に合わせればクラウドアプリとして使えるんだろ。
次は 一番得票の多い指し手を1つ選ぶプログラムを作ってくれだぜ」

20211118blog36.png

ramen-tabero-futsu2.png
「 👆 Scan で こんなデータが撮ってくれるから、 Items で アイテムの配列が取れそうだよな」

{'S', '+5958OU'}

ramen-tabero-futsu2.png
「 👆 何だぜ これ?」

kifuwarabe-futsu.png
「 お父んが入れたんだろ 直せ」

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}]")

20211118blog37.png

ramen-tabero-futsu2.png
「 👆 こんな感じで取れるぜ」

ohkina-hiyoko-futsu2.png
「 それだと 同じ票数のとき 抽選になってないわよ?」

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}]")

ramen-tabero-futsu2.png
「 👆 はい、書き直したぜ」

kifuwarabe-futsu.png
「 投票がめんどくさいぜ。 Webサイトにならんの?」

ramen-tabero-futsu2.png
「 AWS に Webサーバー立てれるのかだぜ?」

📖 [第一部]これならわかる!Flask+Nginx+uWSGIをAWSに丁寧にデプロイ

ramen-tabero-futsu2.png
「 👆 うーん、難しすぎるぜ」

ohkina-hiyoko-futsu2.png
「 じゃあ Python Flask だけでも先に作りましょう」

📖 muzudho/e-gov-vote-python-flask

ramen-tabero-futsu2.png
「 👆 Git Hub のリポジトリを先に用意しとこ」

20211118blog38.png
20211118blog39.png

ramen-tabero-futsu2.png
「 👆 大枠は こうだな」

kifuwarabe-futsu.png
「 投票のPythonスクリプトも実装してしまえばどうだぜ?」

20211119blog40.png
20211119blog41.png
20211119blog42.png

ramen-tabero-futsu2.png
「 👆 全部 Python で書いてるので 簡単に組み込めた」

ramen-tabero-futsu2.png
「 AWS EC2 に置く方法は また明日 調べようぜ」

へこへこ次の日

AWS EC2インスタンスを起動しようぜ(^~^)?

📖 AWS EC2インスタンスを起動しようぜ(^~^)?

ramen-tabero-futsu2.png
「 *.pem ファイルを大事に持っとけというけど、どのディレクトリーに置いておけばいいんだぜ?」

📖 AWSのSSH接続で少しつまづいた所 .pemファイルあたり

C:\Users\<ユーザー名>\.ssh

ohkina-hiyoko-futsu2.png
「 👆 .ssh ディレクトリーの下でどうなの?」

20211119blog54.png

ramen-tabero-futsu2.png
「 👆 Windows ターミナルでそのディレクトリーへ移動するぜ」

ssh-add ./<PEM名>.pem

Output:

Error connecting to agent: No such file or directory

ramen-tabero-futsu2.png
「 👆 ウーム」

kifuwarabe-futsu.png
「 Windows に ssh-add なんて洒落たもの無いのでは?」

EC2インスタンスにSSH接続するのどうやるんだっけ?(1)

その1
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?

kifuwarabe-futsu.png
「 じゃあ ディレクトリーを一覧してくれだぜ」

20211119blog60.png

ramen-tabero-futsu2.png
「 👆 あっ、接続できてるぜ」

ohkina-hiyoko-futsu2.png
「 ポート開いて Nginx uWSGI を設定するところから始めるの?」

Dockerのインストール始まり(1)

記事を移動しました。
📖 AWS EC2のインスタンスにDockerをインストールするにはどうやったらいいんだぜ(^~^)?

kifuwarabe-futsu.png
「 じゃあ お父んのローカルPCで Docker コンテナを作れだぜ」

📖 nngs-docker

kifuwarabe-futsu.png
「 👆 まえに nngs-docker を作ったことがある。参考にしろ」

📖 nginx-uwsgi-flask-hello-world

ramen-tabero-futsu2.png
「 それ nginx uWSGI Flask じゃないんで、別のやつで」

ramen-tabero-futsu2.png
「 あれ? わたしのPC Docker がインストールされてない?」

📖 Install Docker Desktop on Windows

ohkina-hiyoko-futsu2.png
「 👆 インストールすりゃいいのよ」

ramen-tabero-futsu2.png
「 docker はインストールできたけど、 docker-compose はインストールされてないぜ?」

📖 Docker Desktop

ohkina-hiyoko-futsu2.png
「 👆 Docker Desktop に同梱されてるそうよ」

ramen-tabero-futsu2.png
「 せっかく Docker 入れたのに またか」

20211119blog62.png

ramen-tabero-futsu2.png
「 👆 前に動いていたプログラムが動かん。いったいなぜ?」

kifuwarabe-futsu.png
「 直せだぜ」

20211119blog63a1.png

kifuwarabe-futsu.png
「 👆 改行コードが変わってるぜ」

ramen-tabero-futsu2.png
「 変わってなくていいのに……」

20211119blog64.png

ramen-tabero-futsu2.png
「 スモークテストはok。 これをベースに 世界政府きふわらべ を移植しようぜ?」

20211119blog66.png

ramen-tabero-futsu2.png
「 👆 エラーハンドリングも覚えたぜ。 ほんとは エラーの内容を表示すると クラッカーに狙われるからダメなんだけど」

20211119blog67.png

ramen-tabero-futsu2.png
「 👆 まず、 クラウドにデータベースを用意するぜ」

20211119blog68.png

ramen-tabero-futsu2.png
「 👆 Docker環境に クレデンシャルを置く方法 どうやるんだぜ?」

kifuwarabe-futsu.png
「 ローカルPCのディレクトリをマウントしたらどうだぜ?」

ramen-tabero-futsu2.png
「 👆 docker-compose.yaml ファイルでマウントする方法があった気もするが忘れたんで そろそろ寝る」

ほねほね別の日

📖 What is the best way to pass AWS credentials to a Docker container?

📖 AWS CLI を使用して Amazon S3 バケットに接続する際に発生する「認証情報が見つかりません」というエラーを修正する方法を教えてください。

aws configure list

ramen-tabero-futsu2.png
「 👆 ローカルPCの AWS のクレデンシャルファイルを探す方法はこれでいいんだぜ」

20211120blog69a1.png

kifuwarabe-futsu.png
「 👆 Dockerコンテナにログインしろだぜ」

20211120blog70.png

ramen-tabero-futsu2.png
「 👆 aws コマンド無いぜ」

ohkina-hiyoko-futsu2.png
「 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

ramen-tabero-futsu2.png
「 👆 Docker コンテナの中のわたしにルート権限無いの?」

pwd
/usr/local/var/log

ramen-tabero-futsu2.png
「 👆 なんでこんなところに居るのか?」

kifuwarabe-futsu.png
「 docker exec コマンドで入れば?」

su -

ramen-tabero-futsu2.png
「 👆 いや、これでルート権限にまずする」

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

ramen-tabero-futsu2.png
「 👆 .aws ディレクトリー、どこにも無いな?」

exit
docker-compose down

ramen-tabero-futsu2.png
「 👆 Dockerコンテナを落として、作り直すか」

    # TODO クレデンシャルファイルをマウント
    volumes:
      - C:/Users/むずでょ/.aws/credentials:/home/app/.aws/credentials:ro

ramen-tabero-futsu2.png
「 👆 これでマウントできてるんだが、 /home/app なんかに置いてていいのかだぜ?」

kifuwarabe-futsu.png
「 /root/.aws/credentials ディレクトリに置いたらどうだぜ?」

ramen-tabero-futsu2.png
「 待てだぜ。 boto3 はどのディレクトリをデフォルトと思って読みに行くんだぜ?」

📖 boto3 Credentials

4. Shared credential file (~/.aws/credentials)

kifuwarabe-futsu.png
「 ホームディレクトリの下に .aws ディレクトリを作れだぜ」

ramen-tabero-futsu2.png
「 ホームってどこ? わたしは誰?」

    # TODO クレデンシャルファイルをマウント
    volumes:
      - C:/Users/むずでょ/.aws/credentials:/root/.aws/credentials:ro

ramen-tabero-futsu2.png
「 👆 こう書いても .aws ディレクトリは作られてないぜ」

ohkina-hiyoko-futsu2.png
「 docker exec で入った方がよくない?」

docker exec -it e-gov-vote-kifuwarabe-server-frontend-1 bash

Output:

root@d0f79a89857b:/usr/local/var/log#

ramen-tabero-futsu2.png
「 👆 これで見ると /home/app/.aws ディレクトリはあるぜ」

root@d0f79a89857b:/home/app# mv .aws /root

ramen-tabero-futsu2.png
「 👆 コンテナの中でこうやって動かせば いいんだろうけど」

    # TODO クレデンシャルファイルをマウント
    volumes:
      - C:/Users/むずでょ/.aws/credentials:/home/app/.aws/credentials:ro
      # ↓ 機能しない?
      # - C:/Users/むずでょ/.aws/credentials:/root/.aws/credentials:ro

ramen-tabero-futsu2.png
「 👆 なんで 機能しないんだぜ?」

ramen-tabero-futsu2.png
「 あれ? 機能してるぜ?」

kifuwarabe-futsu.png
「 ローカルPC ではそれでいいかもしれないが、 AWS EC2 の ubuntu の上ではどうするんだぜ?」

ramen-tabero-futsu2.png
「 AWS EC2 の ubuntu に /root/.aws ディレクトリーを作って置くしかなくない?」

📖 e-gov-vote-kifuwarabe-server

ohkina-hiyoko-futsu2.png
「 👆 じゃあ これを AWS EC2 に SSH で置きなさいよ」

EC2インスタンスにSSH接続するのどうやるんだっけ?(2)

その2
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?

20211120blog103.png

ramen-tabero-futsu2.png
「 👆 すると ディレクトリ階層が見えているぜ」

ohkina-hiyoko-futsu2.png
「 そこに ファイルをアップロードできるの?」

20211120blog104a1.png

ramen-tabero-futsu2.png
「 👆 permission denied が出て、ディレクトリを作ることもできないぜ」

kifuwarabe-futsu.png
「 その Dockerコンテナに どんなユーザーアカウントが登録されているんだぜ?」

cat /etc/passwd

📖 Linuxでユーザーの一覧や現在のユーザを確認する方法とは?

20211120blog105.png

ramen-tabero-futsu2.png
「 👆 ubuntu ユーザーはいるけど、どんな権限を持たせたらいいんだぜ?」

ohkina-hiyoko-futsu2.png
「 トップ階層ではなく、ホームの下なら ディレクトリーを作れるんじゃないの?」

20211120blog106a1.png

ramen-tabero-futsu2.png
「 👆 おーー、作れたぜ」

20211120blog107.png

ramen-tabero-futsu2.png
「 👆 ドラッグ&ドロップで コピーになるな」

ramen-tabero-futsu2.png
「 Dockerのインストール方法もう忘れたんだけど」

kifuwarabe-futsu.png
「 別記事にメモった方がいいのでは?」

Dockerのインストール始まり(2)再掲

リンク
📖 AWS EC2のインスタンスにDockerをインストールするにはどうやったらいいんだぜ(^~^)?

AWS EC2へのdocker-composeのインストール始まり(1)

リンク
📖 AWS EC2のインスタンスにdocker-composeをインストールする方法が分からないぜ(^~^)

ふなふな別の日

EC2インスタンスにSSH接続するのどうやるんだっけ?(3)

その3
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?

ramen-tabero-futsu2.png
「 \ (ルート)に接続するぜ」

20211121blog113.png

ramen-tabero-futsu2.png
「 👆 昨日は docker-compose をインストールしたのに
コマンドが無いと言われるので どうしよう、
というところで終わったんだぜ」

📖 Docker-compose: /usr/local/bin/docker-compose : line 1: Not: command not found

ramen-tabero-futsu2.png
「 👆 あれっ? Docker compose インストールされてないぜ?」

kifuwarabe-futsu.png
「 別記事にしろだぜ」

AWS EC2へのdocker-composeのインストール始まり(2)

再掲リンク
📖 AWS EC2のインスタンスにdocker-composeをインストールする方法が分からないぜ(^~^)

20211121blog117.png

ramen-tabero-futsu2.png
「 👆 外側のOSが Windows ではなくて Ubuntu に変わったからな。
置き場所を考えないとな」

20211121blog118a1.png

ramen-tabero-futsu2.png
「 👆 docker-compose コマンドが動きそうだぜ」

20211121blog119.png

ramen-tabero-futsu2.png
「 👆 localhost がダブってるらしいぜ!」

kifuwarabe-futsu.png
「 curl localhost してくれだぜ」

20211121blog120.png

ramen-tabero-futsu2.png
「 👆 できてるように見えるなあ」

ohkina-hiyoko-futsu2.png
「 その仮想マシンに、外部からアクセスできる URL は何なの?」

ramen-tabero-futsu2.png
「 👆 IPアドレスだろ」

20211121blog121.png

ramen-tabero-futsu2.png
「 👆 ほら」

kifuwarabe-futsu.png
「 それは AWS EC2 のインスタンスに割り振られた IPアドレスだろ」

20211121blog122.png

ramen-tabero-futsu2.png
「 👆 ドメインとしてはこれか」

20211121blog124.png

ohkina-hiyoko-futsu2.png
「 ubuntu の Fire wall のポートを開けてよ」

ramen-tabero-futsu2.png
「 u(ウブンチュ)のファイアー(f)ウォール(w)」

20211121blog123.png

ramen-tabero-futsu2.png
「 👆 ufw 動いてないぜ」

kifuwarabe-futsu.png
「 動かせだぜ」

📖 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

ramen-tabero-futsu2.png
「 👆 動かしはしたぜ」

ohkina-hiyoko-futsu2.png
「 ポートを開けてよ」

📖 ufwコマンドの使い方

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

ramen-tabero-futsu2.png
「 👆 フーム、何も設定がないのか」

$ sudo ufw status numbered
Status: active

ramen-tabero-futsu2.png
「 👆 いったい何をすれば?」

kifuwarabe-futsu.png
「 8080ポートを開けてくれだぜ」

$ 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)             

ramen-tabero-futsu2.png
「 👆 開けたけど」

kifuwarabe-futsu.png
「 開いてないぜ」

20211121blog125.png

ramen-tabero-futsu2.png
「 👆 Connection refused というのは、接続拒否なんだぜ。何かが意図的に接続を拒否してるんだぜ」

ohkina-hiyoko-futsu2.png
「 AWSのセキュリティ設定が、インスタンスの裁量に干渉しているそうよ」

20211121blog126.png

ramen-tabero-futsu2.png
「 👆 じゃあ ここでセキュリティ管理を一括してできるということかだぜ?」

kifuwarabe-futsu.png
「 一括かどうかは知らん」

20211121blog127.png

ramen-tabero-futsu2.png
「 👆 開いたけど……、じゃあ 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

ramen-tabero-futsu2.png
「 👆 よし」

20211121blog128.png

ramen-tabero-futsu2.png
「 👆 IPアドレスでもアクセスできるな」

a e-gov 3.21.39.126

ramen-tabero-futsu2.png
「 👆 Value Domain の DNS 設定で ワラベンチャードメインの Aレコードを設定」

20211121blog129.png

ramen-tabero-futsu2.png
「 👆 よし、でけた」

どんどこ別の日

EC2インスタンスにSSH接続するのどうやるんだっけ?(4)

その4
📖 EC2インスタンスにSSH接続するのどうやるんだっけ(^~^)?

ramen-tabero-futsu2.png
「 結局 SSH接続できなかったんで t2.large インスタンスを停止」

ramen-tabero-futsu2.png
「 メモリが 8GB では足りなかったのかも知らん、メモリが 16GBの t2.xlarge インスタンスを起動」

電子政府きふわらべサーバーをAWS EC2インスタンスにデプロイしようぜ(^~^)?

リンク
📖 電子政府きふわらべサーバーをAWS EC2インスタンスにデプロイしようぜ(^~^)?

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事