2020年11月29日日曜日

AWS RDS/Auroraを停止状態から削除する

停止状態からAWSのDBを削除できるか

RDS DBを止めた状態(stopped)から消す、をいうことを試していたときのメモ。

RDSを消す

RDSは停止状態から消せます。
ちなみにDeletion Policyも、停止したままで変更できます。

Auroraを消す


Auroraは停止状態では消すことができません。
Startしてからでないと消せません。

こういうエラーが出ます。(database-2というDB名)

$ aws rds delete-db-instance --db-instance-identifier database-2-instance-1

An error occurred (InvalidDBClusterStateFault) when calling the DeleteDBInstance operation: Db cluster database-2 is in stopped state


Auroraを消すときの手順

クラスター内のインスタンスを全て消してからクラスターを消します。 

https://aws.amazon.com/premiumsupport/knowledge-center/rds-error-delete-aurora-cluster/


最後の1つのインスタンスを消すと、同時にクラスターも削除されます。
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_DeleteInstance.html


クラスターでDeletion ProtectionがEnableとなっていても、中のインスタンスは削除できます。ただし、最後の1つのインスタンスを消しても、クラスターが残っていて、データも残っている扱いになるようです。再開するにはインスタンスを追加します。
Aurora clusters with a single DB instance
If you try to delete the last DB instance in your Aurora cluster, the behavior depends on the method you use. You can delete the last DB instance using the AWS Management Console. Doing so also deletes the DB cluster. You can also delete the last DB instance through the AWS CLI or API, even if the DB cluster has deletion protection enabled. In this case, the DB cluster itself still exists and your data is preserved. You can access the data again by attaching a new DB instance to the cluster.

コンソールで消せなくなるとき

最後にRegionalだけを残したら、Consoleでは消せなくなりました。CLIでこのようにして消しました。

$ aws rds delete-db-cluster  --db-cluster-identifier database-2 --skip-final-snapshot


余談

 DBは停止していても7日で自動で動き始めるので注意が必要です。それに関しては対策が公式blogで紹介されています。

https://aws.amazon.com/blogs/architecture/field-notes-stopping-an-automatically-started-database-instance-with-amazon-rds/

2020年11月23日月曜日

AWS DMSで Cannot connect to ODBC provider ODBC general error

Database Migration ServiceでAuroraを別リージョンに移動させるときにエラー。結局別リージョンは関係なかったのですが。

結論:

  • Source EndpointをAuroraにするときは、(クラスターではなく)インスタンスがエンドポイント。これは選択候補に現れる
  • Target EndpointをAuroraにするときは、reader(ro)をエンドポイントにする。別リージョンのときは自分で入力しないといけない
  • Connection Testをすること
  • AssessmentはPassしていてもConnectionはエラーになることがある


設定して開始できない状態。

AssessmentをやってみるとPassしている



Connectionを見ると、エラーになっている・・・。開始するにはコネクションを直さないと、ということのようでした。



調べたら、これが出てきました。

https://aws.amazon.com/premiumsupport/knowledge-center/dms-endpoint-connectivity-failures/

To resolve these errors, confirm that the following endpoint details are set correctly:

Username and Password

ServerName (DB instance endpoint name)

Port

接続の問題なのでそこを見直しなさいということで。


---

何かの英語の資料でAuroraでは別リージョンにはDMSできないという記事があったのですが、、何かが間違っていたのでしょう。

 



AWS DMSでFailed Table has LOBs but no primary keyになった

結論:

Selection rulesで Schema nameを % にしていたので失敗した。 


エラー:

Database Migration Serviceを練習しようとして、エラーが出ていました。

- LOB column(s) not nullable

- Table has LOBs but no primary key

というエラーです。


変更したのはこの部分。今回はmydbと入れています。デフォルトでは%になっています。table名は%のままでいけました。。



うろ覚えでやっていたのでいろいろ失敗しました。

・エンドポイントを登録したらテストをする

・premigration assessmentをしておけば、本番と同じ失敗になる(失敗があれば)


トラブルシューティングには


Tasks fail when a primary key is created on a LOB column

In FULL LOB or LIMITED LOB mode, AWS DMS doesn't support replication of primary keys that are LOB data types.


DMS initially migrates a row with a LOB column as null, then later updates the LOB column. So, when the primary key is created on a LOB column, the initial insert fails since the primary key can't be null. As a workaround, add another column as primary key and remove the primary key from the LOB column.


・・・とか書いてあり、よく分からなかったのですが結局スキーマの問題ということで。

2020年11月21日土曜日

Raspberry Pi にVSCODEをインストールする

2020年10月から、Raspberry PiにVSCode公式版がインストールできるようになったそうです。それまでは、いろんな手段で無理やりインストールしていた模様。


環境

Raspberry Pi 3B+

VSCODE 1.51


やったこと

https://code.visualstudio.com/#alt-downloads にアクセス。


deb のARM版をダウンロード。ARM64は64bit用ですからNGです。




今回ダウンロードしたファイルは code_1.51.1-1605051085_armhf.deb

でした。インストールするには

sudo dpkg -i code_1.51.1-1605051085_armhf.deb

とします。で完了です。問題なくうごいています。

しかし3B+ではパワー不足でマルチタブで編集しているとフリーズ気味です。

2020年11月19日木曜日

DynamoDBで、RCU,WCUを変更したいとき、


Consoleから変更するとき

Capacityタブを選択して、変更できます。



この画像では、2WCU, 2RCUで1.33USB/monthという費用が示されています。


CLIでRCU, WCUを変更する例

準備

Moviesというテーブルを作成します。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.01.html


dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")

の、Download版に接続するためのlocalhostの記述を消して、boto3.resource('dynamodb') とすると、AWS上で作成されます。

        ProvisionedThroughput={

            'ReadCapacityUnits': 10,

            'WriteCapacityUnits': 10

        }

となっているのでRCU,WCUは10で作成することになります。

CLIコマンド

RCU、WCUを1に変更するには、CLIでupdate-tableメソッドを使ってこのようにします。

$ aws dynamodb update-table --table-name Movies --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/update-table.html 

2020年11月18日水曜日

DynamoDBのCLIで、JSONの中で改行するとエラーになる件

CLIでDynamoDBテーブルにitemを入れるとき、JSONの書き方が改行ありなしで2種類紹介されています。しかし、後者の改行ありのやり方ではできませんでした。 
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.CLI.html 


Error parsing parameter '--item': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 33 (char 32)  

というエラーが出ています。{}の中での 改行がエラーになるようです。



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  

aws dynamodb put-item \
    --table-name Music \
    --item '{ \
        "Artist": {"S": "Acme Band"}, \
        "SongTitle": {"S": "Happy Day"}, \
        "AlbumTitle": {"S": "Songs About Life"} }' \
    --return-consumed-capacity TOTAL 

2020年11月16日月曜日

AWS LambdaでKMSをDisableする

 ベストプラクティスにはKMSの無効化についてLambdaを使うとか書かれています。


AWS KMS のセキュリティの自動化

CMK の監視中に、特定のアクションが検出された場合、CMK を無効にするか、ローカルのセキュリティポリシーで指示されているその他のインシデント対応アクションを実行するように AWS Lambda 関数を設定することができます。AWS 内の自動化ツールを活用することにより、人間の介入なしで潜在的な露出を数分で遮断することができます。


ということで作りました。LambdaはPython3.8です。

KMSを作る

Create Key
-> Symmetric
-> Next
-> Alias
-> Next
-> Define key admin permissions
-> Define key usage premissions

KMSのIDを後で使います。

LambdaのRoleにつけるPolicy

DisableKMS: ManagedPolicyから作ります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:DisableKey"
            ],
            "Resource": "*"
        }
    ]
}
InlineはLambdaのARNが必要なので、あとでつけました。 Region, AccountIDを変えます。

環境変数を取得するためのポリシー(inline policy)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:GetFunctionConfiguration",
            "Resource": "arn:aws:lambda:Region:AccountID:function:DisableKMS"
        }
    ]
}

CloudWatchにつなぐためのポリシー。Region, AccountIDを変えます。(inline policy)
※Lambdaを作るときにポリシーを作ると、これが同時にできるはず。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:Resion:AccountID:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:Resion:AccountID:log-group:/aws/lambda/DisableKMS:*"
            ]
        }
    ]
}

DisableKMSという名前のLambdaを作ります。Lambdaのcodeは以下です。環境変数にKMSID=ターゲットKMSのIDを指定します。
import botocore
import boto3
from botocore.exceptions import ClientError


def lambda_handler(event, context):
    client = boto3.client('kms')
    lambdaFunc = boto3.client('lambda')
    print('Trying to get Environment variable')
    try:
        funcResponse = lambdaFunc.get_function_configuration(
            FunctionName='DisableDMS'
        )
        KMSID = funcResponse['Environment']['Variables']['KMSID']
        print('Disabling KMD id: ' + KMSID)
    except ClientError as e:
        print(e)
    try:
        response = client.disable_key(
            KeyId=KMSID
        )
        print('Success :: ')
        return response
    except ClientError as e:
        print(e)
    return
    {
        'message': "Script execution completed. See Cloudwatch logs for complete output"
    }

とりあえずは動作するのですが、ベストかというと謎ですが・・・。


おまけ

LambdaからCloudWatchへのアクセスのポリシーがないとき、CloudWatchコンソールを開くとこんなエラーが出ていました。



2020年11月14日土曜日

RDSのpublic accessオプションをコンソールで変更できない

Publically Accessible

RDS/Auroraには Publically Accessibleという設定項目があって、VPC外部からのアクセスの許可に使われます。

このPublically Accessibleは、作成時にはチェックボックスがありますが、変更はコンソールからはできないようです。(けっこう探してしまった・・・)

しかも作成時は折り畳まれた設定部分にあるので見つけにくいです。下のAdditional connectivity configurationを開きます。



展開すると、チェックボックスが出てきます。




データベースインスタンスの画面で確認すると、Public accessibilityがYesになっています。





変更は、CLI、APIで

即時有効、ダウンタイムなし 

CLI option:

--publicly-accessible|--no-publicly-accessible

RDS API parameter:

PubliclyAccessible

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html


とりあえず現状を見てみます(database-1)。attributeを見る方法がよく解らず、grepで

$ aws rds describe-db-instances --db-instance-identifier database-1 | grep PubliclyAccessible

とやると

"PubliclyAccessible": true,

が返ります。

trueなので、--no-publicly-accessibleを使ってfaluseにしてみます。

$ aws rds modify-db-instance --no-publicly-accessible --db-instance-identifier database-1 

と思ったらStoppedだから変更できません。

An error occurred (InvalidDBInstanceState) when calling the ModifyDBInstance operation: Cannot modify a stopped DB Instance


再び実行すると、JSONの結果がズラッと出てきました(describe-dbと同じ結果が出力)。

数分待つと変更できていました。


以前は変更できなかったらしい

2015年以前(?)は、途中で変更できず、インスタンスを作り直すしかなかったらしいです。

Posted on: Jun 16, 2013 8:31 PM

You can create a snapshot of the current RDS database and launch it with the publicly accessible option.

https://forums.aws.amazon.com/thread.jspa?threadID=127344

EC2インスタンスにIPv4でアクセスするときはhttpでという話

 EC2のIPアドレスをブラウザで開くとき、コピーしてChromeのアドレスバーに貼っていたのですが、エラーが出ていました。



This site can't be reached took too long time. ERR_CONNECTION_TIMED_OUT....

何故なのか解らず調べていたのですが、スマートフォンでは繋がるということで、ブラウザ側の問題だろうと思ってクッキー消して見たりしましたが(そういうエラーは出ていないんですが)、よく解らず・・・。

結局のところ、Chromeにアドレスを貼り付けるとHTTPS扱いになってしまっているのが理由でした。HTTPで繋げば大丈夫でした。初歩的・・・。





awsのドキュメントページが見れなくなってcookieを削除した

 https://docs.aws.amazon.com/

が繋がらない状態になりました。英語のページ/en_us/がNGで、日本語ページは繋がります。メンテナンスとかで停止しているのかな、と思いきや、クッキーを削除してみてくださいとのこと。


https://support.google.com/chrome/answer/95647

こちらの通りにChoromのSettingsから該当のdocs.aws.amazon.comを消したら復活しました。docのページでDarkモードにできるのですが、それが何か引き起こしたんでしょうか。


ちなみにAndroidスマートフォンでも同様に落ちていました(PC画面はキャプチャし忘れたのでこちらを)



スマートフォンのChromeではcookieをサイト毎に消せないようで、まとめて消しました。復活。


2020年11月11日水曜日

EC2のlink local addressでメタデータを見る

EC2にログインした状態で link-local address (169.254.169.254)にアクセスします。curlで情報を取得できます。

t2.microのデフォルト設定で起動して、connectします。

[ec2-user@ip-xxxx ~]$ curl -s http://169.254.169.254/latest/meta-data

でメタデータを見ると、以下のように出力されました。

ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hibernation/ hostname identity-credentials/ instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 mac managed-ssh-keys/ metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups

さらにセキュリティグループは、このようにして得られます。

$ curl -s http://169.254.169.254/latest/meta-data/security-groups/

launch-wizard-3

と出力されます。コンソールから確認すると、確かにsecurity group nameになっています。この方法で得られるのは、あくまで名前だけで、詳細な設定は見れないようです。





2020年11月9日月曜日

AWSのエラーのメモ

出たエラーをメモ


CloudFormation 

 The following resource(s) failed to create: [ServerSecurityGroup, SSHSecurityGroup]. . Rollback requested by user.


SSHSecurityGroup CREATE_FAILED Resource creation cancelled


ServerSecurityGroup CREATE_FAILED The request must contain the parameter GroupDescription (Service: AmazonEC2; Status Code: 400; Error Code: MissingParameter; Request ID: XXXX; Proxy: null)


原因: 別のリージョンで展開しようとしていた。Cfnがtokyoにあるのに、us-west-1aを使おうとしていた。

---

The following resource(s) failed to create: [MyInstance]. . Rollback requested by user.

CREATE_FAILED The image id '[ami-a4c7edb2]' does not exist (Service: AmazonEC2; Status Code: 400; Error Code: InvalidAMIID.NotFound; Request ID: XXXX; Proxy: null) 


原因: 存在しないAMIを呼び出して使おうとしていた。

---

Cfnのテンプレートをつなげる"---"はハイフン3つでないとエラー

次の行でエラーが出てしまう

---

テンプレートがCompleteしてから、Stack policyだけを追加しようとするとこのエラーが出て、変更できません。試しにタグも追加してみると更新できました。

There was an error creating this change set

The submitted information didn't contain changes. Submit different information to create a change set.

---

Cfnでインスタンスのtypeを指定しなかった場合、m1.smallで起動されていました。