2019年7月11日木曜日

redisにデータを入れようとしたら、エラーが発生しました。(error) READONLY You can't write against a read only replica.

AWSのElastiCacheでredisタイプのサーバを作ってみました。

以下のコマンドで、telnetを入れて接続しました。


$ sudo yum install -y telnet
telnet test-myredis-for-web-ro.5irjbr.ng.0001.apne1.cache.amazonaws.com 6379

いざデータを入れようとしたら、エラーが発生しました。
$-1
set hoge hogehoge
-READONLY You can't write against a read only replica.


調査したところ、awsはデフォルト3つのノートを作成されるらしいです。
一つ「primary」と2つ「replica」が作られます。
書き込み用として使えるのは「primary」のみです。

「primary」用エンドポイントを使って再度接続し、データを入れてみたら、問題が解消できました。
以下↓「primary」用ノートのエンドポイントとなります。

2019年7月9日火曜日

s3、特定のバケットに対して外部からのアクセス(閲覧のみ)を許可設定

まず、バケット作成から

S3のコンソールから、「バケットを作成する」をクリックします

バケット名は「test-open-to-public」と入力
プロパティはデフォルトのままで進みます
「アクセス許可の設定」に上の2つをチェックする。後でポリシーを追加できるため、下の2つを外しておきます。
新しいアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
最後「バケットを作成」ボタンを押します。

作成したバケットに対して、アクセス権限を設定します。

「アクセス権限」→「バケットポリシー」の順にバケットポリシーエディター画面を開きます。
以下のソースコードを貼り付けした後、「保存」ボタンを押します。
※注意してほしいのは、「Resource」のところ、自分のバケット名に書き換えるが必要です。
{
    "Version""2008-10-17",
    "Statement": [
        {
            "Sid""AllowPublicRead",
            "Effect""Allow",
            "Principal": {
                "AWS""*"
            },
            "Action""s3:GetObject",
            "Resource""arn:aws:s3:::test-open-to-public/*"
        }
    ]
}

2019年7月8日月曜日

PythonでSeleniumのclickメソッドは効かない

PythonでSeleniumのclickメソッドがどうしても効かない問題に遭遇しました。

最初に使ったソースコードは以下の通りです。

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://xxxxx/')  # 自分の検証サイトのURL
submit = driver.find_element_by_id("submitbutton")
submit.click()


調べたところ、要素はブラウザー上にクリックできない場所に存在している可能性があります。

でしたら、ブラウザーを最下部に移動してみようと考えました。

以下のコードを使って、最下部にスクロールしました。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

再度検証したところだめでした。


再度調査したら、Seleniumが介在せずそのまま実行するならうまくいくかもしれませんの情報がありました。

Seleniumで直接javascriptを実行し、ボタンをクリックします。

driver.execute_script("document.getElementById('submitbutton').click();")

検証したところ、だめでした。

「ENTER」キーならうまくいった情報もありましたので、

「ENTER」キーを使ってクリックします。

submit.send_keys(Keys.ENTER)

結果としてだめでした。

気分を取り直して、要素に焦点を当たってからクリックするのも検証しました。

要素に焦点を当たります

ActionChains(driver).move_to_element(submit).perform()

それでもだめでした。

最後に辿り着いたのは「submit」メソッドでした。

driver.submit()

やっとうまくいきました。

フォームの中のボタン、クリックメソッドを使うより、サブミットの方がいいらいいです。