7.1. HTMLドキュメントの作成

作業の目的 [why]

HTMLドキュメントを作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1

JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在する。

完了条件2

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在する。

完了条件3

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在する。

完了条件4

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1

HTMLファイル用ディレクトリ"${HOME}/environment/contents-handson-cli-cognito-identity"が存在する。

事前条件2

JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在しない。

事前条件3

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在しない。

事前条件4

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在しない。

事前条件5

HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在しない。

事前条件6

Cognito識別子プール"handson-cli-cognito-identity-idpool"が存在する。

事前条件7

S3バケット"handson-cli-cognito-identity-data-XXXXXXXXXXXX"が存在する。

作業対象 [what]

  • ローカル環境

標準時間(合計)

8分

パラメータ設定

パラメータ設定の標準時間

2分

作業に必要なモノ・情報 [resource]

作業開始には、以下が全て揃っていることが必要です。

リソース1: HTMLドキュメントファイル用ディレクトリ

  • 今回は"${HOME}/environment/contents-handson-cli-cognito-identity"をHTMLドキュメントファイル用ディレクトリとします。

ディレクトリが存在することを確認します。

コマンド:

ls -d ${HOME}/environment/contents-handson-cli-cognito-identity

結果(例:存在する場合):

${HOME}/environment/contents-handson-cli-cognito-identity

存在しない場合は作成します。

コマンド:

mkdir -p ${HOME}/environment/contents-handson-cli-cognito-identity

リソース2: JavaScriptファイル名

  • 作成するJavaScriptファイルの名称です。

  • 今回は"post.js"とします。

リソース3: HTMLドキュメント名 (入力ページ)

  • 作成するHTMLドキュメント(入力ページ)の名称です。

  • 今回は"contact.html"とします。

リソース4: HTMLドキュメント名 (インデックスページ)

  • 作成するHTMLドキュメント(インデックスページ)の名称です。

  • 今回は"index.html"とします。

リソース5: HTMLドキュメント名 (ありがとうございましたページ)

  • 作成するHTMLドキュメント(ありがとうございましたページ)の名称です。

  • 今回は"thanks.html"とします。

リソース6: Cognito IDプール名

  • 作成するHTMLドキュメント(入力ページ)が利用するCognito IDプールの名称です。

  • 今回は"handson-cli-cognito-identity-idpool"とします。

リソース7: S3バケット名

  • 作成するHTMLドキュメント(入力ページ)が利用するS3バケットの名称です。

  • 今回は"handson-cli-cognito-identity-data-XXXXXXXXXXXX"とします。

リソース8: AWS SDK for Javascriptバージョン

  • 作成するHTMLドキュメント(入力ページ)が利用するAWS SDK for Javascriptの名称です。

  • 今回は"2.562.0"とします。

パラメータの指定

作業に必要なパラメータを変数に格納をします。

0.0. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

0.1. HTMLドキュメントファイルディレクトリの指定

変数の設定:

DIR_HTML_DOC="${HOME}/environment/contents-handson-cli-cognito-identity"

0.2. Javascriptファイル名の指定 (入力ページ)

入力ページのJavaScriptファイル名を指定します。

変数の設定:

HTML_DOC_NAME_JS='post.js'

変数の設定:

FILE_HTML_DOC_JS="${DIR_HTML_DOC}/${HTML_DOC_NAME_JS}" \
  && echo ${FILE_HTML_DOC_JS}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/post.js

0.3. HTMLドキュメント名の指定 (入力ページ)

入力ページのHTMLドキュメント名を指定します。

変数の設定:

HTML_DOC_NAME_FORM='contact.html'

変数の設定:

FILE_HTML_DOC_FORM="${DIR_HTML_DOC}/${HTML_DOC_NAME_FORM}" \
  && echo ${FILE_HTML_DOC_FORM}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/contact.html

0.4. HTMLドキュメント名の指定 (インデックスページ)

インデックスページのHTMLドキュメント名を指定します。

変数の設定:

HTML_DOC_NAME_INDEX='index.html'

変数の設定:

FILE_HTML_DOC_INDEX="${DIR_HTML_DOC}/${HTML_DOC_NAME_INDEX}" \
  && echo ${FILE_HTML_DOC_INDEX}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/index.html

0.5. HTMLドキュメント名の指定 (ありがとうございましたページ)

ありがとうございましたページのHTMLドキュメント名を指定します。

変数の設定:

HTML_DOC_NAME_THANKS='thanks.html'

変数の設定:

FILE_HTML_DOC_THANKS="${DIR_HTML_DOC}/${HTML_DOC_NAME_THANKS}" \
  && echo ${FILE_HTML_DOC_THANKS}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html

0.6. Cognito IDプール名の指定

Cognito IDプール名を指定します。

変数の設定:

COGNITO_IDENTITY_POOL_NAME='handson-cli-cognito-identity-idpool'

0.7. S3バケット名の指定

変数の設定:

S3_BUCKET_PREFIX_DATA='handson-cli-cognito-identity-data'

コマンド:

AWS_ID=$( \
  aws sts get-caller-identity \
    --query 'Account' \
    --output text \
) \
  && echo ${AWS_ID}

結果(例):

XXXXXXXXXXXX

変数の設定:

S3_BUCKET_DATA="${S3_BUCKET_PREFIX_DATA}-${AWS_ID}" \
  && echo ${S3_BUCKET_DATA}

結果(例):

handson-cli-cognito-identity-data-XXXXXXXXXXXX

0.8. AWS SDK for JavaScriptバージョンの指定

AWS SDK for JavaScriptのバージョンを指定します。

変数の設定:

AWS_SDK_VERSION='2.562.0'

注釈

AWS SDK for JavaScriptの最新バージョン情報は https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/ に記述されています。

パラメータの保存

設定されている変数の保存先となるファイル名を指定します。

変数の設定:

DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli-cognito-identity"
FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-html-form_contact-aws-cognito-create.env" \
  && echo ${FILE_PARAMETER}

結果(例):

${HOME}/tmp/parameter-handson-cli-cognito-identity/2019-11-19-html-form_contact-aws-cognito-create.env

各変数に正しいパラメータ値が格納されていることを確認しながら保存します。

変数の確認:

cat << EOF > ${FILE_PARAMETER}

  # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1"
         AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 0.1. DIR_HTML_DOC:"${HOME}/environment/contents-handson-cli-cognito-identity"
         DIR_HTML_DOC="${DIR_HTML_DOC}"
  # 0.2. FILE_HTML_DOC_JS:"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"
         FILE_HTML_DOC_JS="${FILE_HTML_DOC_JS}"
  # 0.3. FILE_HTML_DOC_FORM:"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"
         FILE_HTML_DOC_FORM="${FILE_HTML_DOC_FORM}"
  # 0.4. FILE_HTML_DOC_INDEX:"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"
         FILE_HTML_DOC_INDEX="${FILE_HTML_DOC_INDEX}"
  # 0.5. FILE_HTML_DOC_THANKS:"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"
         FILE_HTML_DOC_THANKS="${FILE_HTML_DOC_THANKS}"
  # 0.6. COGNITO_IDENTITY_POOL_NAME:"handson-cli-cognito-identity-idpool"
         COGNITO_IDENTITY_POOL_NAME="${COGNITO_IDENTITY_POOL_NAME}"
  # 0.7. S3_BUCKET_DATA:"handson-cli-cognito-identity-data-XXXXXXXXXXXX"
         S3_BUCKET_DATA="${S3_BUCKET_DATA}"
  # 0.8. AWS_SDK_VERSION:"2.562.0"
         AWS_SDK_VERSION="${AWS_SDK_VERSION}"

EOF

cat ${FILE_PARAMETER}

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

タスクの実施

タスク標準時間

6分

1. 前処理

1.1. 処理対象の状態確認

主処理の実施は、以下の状態であることを前提とします。

前提と異なることが判明した場合、直ちに処理を中止します。

事前条件1: HTMLファイル用ディレクトリ"${HOME}/environment/contents-handson-cli-cognito-identity"が存在する。

「HTMLファイル用ディレクトリ"${HOME}/environment/contents-handson-cli-cognito-identity"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_HTML_DOC}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity

事前条件2: JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在しない。

「JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_HTML_DOC_JS}

結果(例):

ls: cannot access ${HOME}/environment/contents-handson-cli-cognito-identity/post.js: No such file or directory

事前条件3: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在しない。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_HTML_DOC_FORM}

結果(例):

ls: cannot access ${HOME}/environment/contents-handson-cli-cognito-identity/contact.html: No such file or directory

事前条件4: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在しない。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_HTML_DOC_INDEX}

結果(例):

ls: cannot access ${HOME}/environment/contents-handson-cli-cognito-identity/index.html: No such file or directory

事前条件5: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在しない。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_HTML_DOC_THANKS}

結果(例):

ls: cannot access ${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html: No such file or directory

事前条件6: Cognito識別子プール"handson-cli-cognito-identity-idpool"が存在する。

「Cognito識別子プール"handson-cli-cognito-identity-idpool"が存在する。」ことを確認します。

コマンド:

aws cognito-identity list-identity-pools \
  --max-results 60 \
  --query "IdentityPools[?IdentityPoolName==\`${COGNITO_IDENTITY_POOL_NAME}\`].IdentityPoolName" \
  --output text

結果(例):

handson-cli-cognito-identity-idpool

事前条件7: S3バケット"handson-cli-cognito-identity-data-XXXXXXXXXXXX"が存在する。

「S3バケット"handson-cli-cognito-identity-data-XXXXXXXXXXXX"が存在する。」ことを確認します。

コマンド:

aws s3 ls s3://${S3_BUCKET_DATA} > /dev/null 2>&1

コマンド:

echo $?

結果(例):

0

1.2. 主処理に必要な情報の取得

IDプールIDの取得

コマンド:

COGNITO_IDENTITY_POOL_ID=$( \
  aws cognito-identity list-identity-pools \
    --max-results 60 \
    --query "IdentityPools[?IdentityPoolName==\`${COGNITO_IDENTITY_POOL_NAME}\`].IdentityPoolId" \
    --output text \
) \
  && echo ${COGNITO_IDENTITY_POOL_ID}

結果(例):

ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

2. 主処理

2.1. JavaScriptファイルの作成

変数の確認:

cat << ETX

  # FILE_HTML_DOC_JS:"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"
    FILE_HTML_DOC_JS:"${FILE_HTML_DOC_JS}"
  # AWS_DEFAULT_REGION:"ap-northeast-1"
    AWS_DEFAULT_REGION:"${AWS_DEFAULT_REGION}"
  # COGNITO_IDENTITY_POOL_ID:"ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    COGNITO_IDENTITY_POOL_ID:"${COGNITO_IDENTITY_POOL_ID}"
  # S3_BUCKET_DATA:"handson-cli-cognito-identity-data-XXXXXXXXXXXX"
    S3_BUCKET_DATA:"${S3_BUCKET_DATA}"

ETX

コマンド:

cat << EOF > ${FILE_HTML_DOC_JS}
var func = function(id) { return document.getElementById(id); };
AWS.config.region = "${AWS_DEFAULT_REGION}";
AWS.config.credentials = new AWS.CognitoIdentityCredentials({IdentityPoolId: "${COGNITO_IDENTITY_POOL_ID}"});
AWS.config.credentials.get(function(err) {
  if (!err) {
    console.log("Cognito Identify Id: " + AWS.config.credentials.identityId);
  }
});

function uploadFile() {
  AWS.config.region = '${AWS_DEFAULT_REGION}';
  var s3BucketName = "${S3_BUCKET_DATA}";
  var now = new Date();
  var obj = {"title": func("title").value, "mail": func("mail").value ,"contents": func("contents").value, "date": now.toLocaleString()};
  var s3 = new AWS.S3({params: {Bucket: s3BucketName}});
  var blob = new Blob([JSON.stringify(obj, null, 2)], {type:'text/plain'});
  s3.putObject({Key: "uploads/" +now.getTime()+".txt", ContentType: "text/plain", Body: blob, ACL: "public-read"},
  function(err, data){
    if(data !== null){
      window.location.href = './thanks.html';
    }
    else{
      alert("Upload Failed" + err.message);
    }
  });
}
EOF

cat ${FILE_HTML_DOC_JS}

結果(例):

var func = function(id) { return document.getElementById(id); };
AWS.config.region = "ap-northeast-1";
AWS.config.credentials = new AWS.CognitoIdentityCredentials({IdentityPoolId: "ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"});
AWS.config.credentials.get(function(err) {
    if (!err) {
        console.log("Cognito Identify Id: " + AWS.config.credentials.identityId);
    }
});

function uploadFile() {
  AWS.config.region = 'ap-northeast-1';
  var s3BucketName = "handson-cli-cognito-identity-data-XXXXXXXXXXXX";
  var now = new Date();
  var obj = {"title": func("title").value, "mail": func("mail").value ,"contents": func("contents").value, "date": now.toLocaleString()};
  var s3 = new AWS.S3({params: {Bucket: s3BucketName}});
  var blob = new Blob([JSON.stringify(obj, null, 2)], {type:'text/plain'});
  s3.putObject({Key: "uploads/" +now.getTime()+".txt", ContentType: "text/plain", Body: blob, ACL: "public-read"},
  function(err, data){
    if(data !== null){
      window.location.href = './thanks.html';
    }
    else{
      alert("Upload Failed" + err.message);
    }
  });
}

2.2. 問合せフォームの作成

変数の確認:

cat << ETX

  # FILE_HTML_DOC_FORM:"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"
    FILE_HTML_DOC_FORM:"${FILE_HTML_DOC_FORM}"
  # AWS_SDK_VERSION:"2.562.0"
    AWS_SDK_VERSION:"${AWS_SDK_VERSION}"
  # HTML_DOC_NAME_JS:"post.js"
    HTML_DOC_NAME_JS:"${HTML_DOC_NAME_JS}"

ETX

コマンド:

cat << EOF > ${FILE_HTML_DOC_FORM}
<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://sdk.amazonaws.com/js/aws-sdk-${AWS_SDK_VERSION}.min.js"></script>
<title>お問い合わせフォーム</title>
<script src="./${HTML_DOC_NAME_JS}"></script>

<div>
  <div>
    <form>
      <table>
        <tr>
          <th>件名</th>
          <td><input id="title" type="text" name="title" maxlength="40" value="" /></td>
        </tr>
        <tr>
          <th>メールアドレス</th>
          <td><input id="mail" type="email" name="mail" size="20" maxlength="50" /></td>
        </tr>
        <tr>
          <th>お問い合わせ内容</th>
          <td><textarea id="contents" cols="70" rows="6" name="contents"></textarea></td>
        </tr>
      </table>
      <div>
        <input onClick="uploadFile();" type="button" value="送信" id="button" />
      </div>
    </form>
  </div>
</div>
EOF

cat ${FILE_HTML_DOC_FORM}

結果(例):

<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.562.0.min.js"></script>
<title>お問い合わせフォーム</title>
<script src="./post.js"></script>

<div>
  <div>
    <form>
      <table>
        <tr>
          <th>件名</th>
          <td><input id="title" type="text" name="title" maxlength="40" value="" /></td>
        </tr>
        <tr>
          <th>メールアドレス</th>
          <td><input id="mail" type="email" name="mail" size="20" maxlength="50" /></td>
        </tr>
        <tr>
          <th>お問い合わせ内容</th>
          <td><textarea id="contents" cols="70" rows="6" name="contents"></textarea></td>
        </tr>
      </table>
      <div>
        <input onClick="uploadFile();" type="button" value="送信" id="button" />
      </div>
    </form>
  </div>
</div>

2.3. インデックスページの作成

変数の確認:

cat << ETX

  # FILE_HTML_DOC_INDEX:"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"
    FILE_HTML_DOC_INDEX:"${FILE_HTML_DOC_INDEX}"
  # HTML_DOC_NAME_FORM:"contact.html"
    HTML_DOC_NAME_FORM:"${HTML_DOC_NAME_FORM}"

ETX

コマンド:

cat << EOF > ${FILE_HTML_DOC_INDEX}
<!DOCTYPE html>
<meta charset="UTF-8">
<title>ようこそ</title>

<h1>ようこそ</h1>

<p><a href="./${HTML_DOC_NAME_FORM}">お問い合わせ</a></p>
EOF

cat ${FILE_HTML_DOC_INDEX}

結果(例):

<!DOCTYPE html>
<meta charset="UTF-8">
<title>ようこそ</title>

<h1>ようこそ</h1>

<p><a href="./contact.html">お問い合わせ</a></p>

2.4. Thanksページの作成

変数の確認:

cat << ETX

  # FILE_HTML_DOC_THANKS:"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"
    FILE_HTML_DOC_THANKS:"${FILE_HTML_DOC_THANKS}"

ETX

コマンド:

cat << EOF > ${FILE_HTML_DOC_THANKS}
<!DOCTYPE html>
<meta http-equiv="refresh" content="5;URL=./${HTML_DOC_NAME_INDEX}">
<meta charset="UTF-8">
<title>お問い合わせありがとうございました。</title>

<h1>お問い合わせありがとうございました。</h1>

<p><a href="./${HTML_DOC_NAME_INDEX}">トップページに戻る</a></p>
EOF

cat ${FILE_HTML_DOC_THANKS}

結果(例):

<!DOCTYPE html>
<meta http-equiv="refresh" content="5;URL=./index.html">
<meta charset="UTF-8">
<title>お問い合わせありがとうございました。</title>

<h1>お問い合わせありがとうございました。</h1>

<p><a href="./index.html">トップページに戻る</a></p>

3. 後処理

完了条件の確認

主処理は、以下を満たしたときに成功したものとします。

完了条件1: JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在する。

「JavaScriptファイル"${HOME}/environment/contents-handson-cli-cognito-identity/post.js"が存在する。」ことを確認します。

コマンド:

ls ${FILE_HTML_DOC_JS}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/post.js

完了条件2: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在する。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/contact.html"が存在する。」ことを確認します。

コマンド:

ls ${FILE_HTML_DOC_FORM}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/contact.html

完了条件3: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在する。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/index.html"が存在する。」ことを確認します。

コマンド:

ls ${FILE_HTML_DOC_INDEX}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/index.html

完了条件4: HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在する。

「HTMLドキュメントファイル"${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html"が存在する。」ことを確認します。

コマンド:

ls ${FILE_HTML_DOC_THANKS}

結果(例):

${HOME}/environment/contents-handson-cli-cognito-identity/thanks.html

完了