AWS

AmazonLinux2でLet’s Encryptがエラー – Sorry, I don’t know how to bootstrap Certbot on your operating system!

久しぶりにAmazonLinux2に触ったら
Let’s Encryptのインストール後、certbot-auto実行でエラーが発生

[ec2-user@ip-99-99-99-99 certbot]$ sudo ./certbot-auto
Sorry, I don't know how to bootstrap Certbot on your operating system!

You will need to install OS dependencies, configure virtualenv, and run pip install manually.
Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
for more info.

certbot-autoを開くと、Amazon Linuxの判定があるけどこれを修正する必要があるらしい。

elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

確かに、判定できない。。

[ec2-user@ip-99-99-99-99 certbot]$ grep -iq "Amazon Linux" /etc/issue
[ec2-user@ip-99-99-99-99 certbot]$
[ec2-user@ip-99-99-99-99 certbot]$ cat /etc/issue
\S
Kernel \r on an \m

[ec2-user@ip-99-99-99-99 certbot]$

これに書き換える。

elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

参考-> Amazon Linux 2でLet’s Encryptが使えない

aws chaliceでpynamodb(dynamodb)を利用する際のIAM policy

chaliceはboto3で使っているメソッドから必要なIAMを自動的に付与(更新しないもできる)する機能を持ってるので、boto3でdynamodbを使ったりすれば、自動で付与されるけど、pynamodbを使った場合はそこまでは面倒見てくれないので、boto3でdynamoを利用せず、pynamodbのモデルしか用意してないと、こんな感じでdynamodbへのポリシーは無視される。

$ chalice gen-policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "275e6aad3b0a4356ac3b9ab90fbe2422"
    }
  ]
}

なので、手動で管理する必要があるけど、Identity and Access Management (IAM)から編集するのはchalice使う意味なくなるので、.chalice/policy.jsonを利用する。

手動で変更してもいいけど、ミスってもいやなので、適当に下記のapp.pyにboto3でdynamoを操作する記述を追加

dynamodb.get_item(TableName="nanndemoiiyo")
dynamodb.put_item(TableName="nanndemoiiyo")
table = dynamodb.create_table(...

この状態でポリシーを見るとDynamodbのポリシーが入るので、jsonとして保存

$ chalice gen-policy > .chalice/policy.json
$ cat .chalice/policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "c5c6757d1033420fa4ba529b67bd333d"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "5a2f50fb91a34608b571409e5291041b"
    }
  ]
}

環境によってサフィックスが必要
今回は「.chalice/policy.json」から「.chalice/policy-dev.json」に変更してデプロイ時は「–no-autogen-policy」をつければOK

cloudformationでCognitoのUserPool作成でエラー

CloudFormationでCognitoのUserPoolを作成しようとしてエラーが出てしまった

aws cloudformation deploy --template-file userPool.yml --stack-name CognitoUserPool-test --capabilities CAPABILITY_IAM  --profile dev-southeast

Waiting for changeset to be created..
Waiting for stack create/update to complete

Failed to create/update the stack. Run the following command
to fetch the list of events leading up to the failure
aws cloudformation describe-stack-events --stack-name CognitoUserPool-test
 {
            "StackId": "arn:aws:cloudformation:ap-southeast-2:00000894962:stack/CognitoUserPool-test/f6e05000-0000-11e9-ba1c-0664273e8e22",
            "EventId": "CognitoUserPool-CREATE_FAILED-2019-08-15T07:26:25.833Z",
            "StackName": "CognitoUserPool-test",
            "LogicalResourceId": "CognitoUserPool",
            "PhysicalResourceId": "",
            "ResourceType": "AWS::Cognito::UserPool",
            "Timestamp": "2019-08-15T07:26:25.833Z",
            "ResourceStatus": "CREATE_FAILED",
            "ResourceStatusReason": "Property validation failure: [Encountered unsupported properties in {/Schema/0}: [Required\"]]",
            "ResourceProperties":
Schema:
   - Name: "name"
   AttributeDataType: String
   Mutable: true
   Required": true

誤字なだけ。。作成できました。

AWS – Cognitoでemailを変更した場合、認証してなくても古いメアドはログインできない

Cogitoを使った認証でユーザが登録後に、メアドを変更する際に
入力ミスで違うメアド入れちゃったけど、アプリからはログアウトしちゃった
という状況はどうなるのか?

javascriptでテストしてみる。

まずユーザを登録する。

var attributeList = [];
attributeList.push(new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute({
	Name: 'name',
	Value: $('#name').val()
}));
attributeList.push(new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute({
	Name: 'email',
	Value: $('#email').val()
}));
userPool.signUp($('#email').val(), $('#password').val(), attributeList, null, function(err, result) {
	if (err) {
		console.log(err);
		return;
	}
	cognitoUser = result.user;
	console.log('Username:' + cognitoUser.getUsername());
});

登録後、認証コードが送られてくるので、認証コードを登録してメールアドレスを認証済みにする。


Cognitoで見ると、メールアドレスは認証済みになっているので
そのユーザでログインして、メールアドレスの変更を行う。


認証コードが新しいメールアドレスに送信されるが
それを認証せずに、古い情報でログインしようとすると


認証エラーが発生してログインできない。

Cognito上ではメアドは変更されていて、認証済みが取り消されている。
これに対応するにはdynamoで管理するか、cognitoに追加の属性を持たせて、認証や変更トリガーでmail属性を認証後にアップデートするようにしました。