HAPPY HACKING Oouchi's BLOG

PSE(ポンコツエンジニア)の技術ブログ

「JAWS-UG CLI専門支部 #162R IAM基礎(インスタンスプロファイル)」でcurlの使いやすさを知った

f:id:ooooouchi:20200629224432p:plain

JAWS-UG CLI専門支部 #162R IAM基礎(インスタンスプロファイル)の参加レポートです。

jawsug-cli.connpass.com

前回参加レポートはこちら

www.ooooouchi.info

感想

毎度のことながらスクリプトや手順がわかりやすくて進めやすかったです。

IAMロールのハンズオンではありましたが、動作確認の一環としてCloudFormationやEC2ユーザーデータの挙動も知れる濃いハンズオンだったと思います!

できるようになったこと

参加したことにより以下のことがAWS CLIでできるようになりました!

  • IAMロールの作成
  • インスタンスプロファイルの作成
  • インスタンスプロファイルのIAMロールへのポリシーアタッチ
  • CloudFormationスタックの作成
  • セキュリティグループ作成
  • ユーザーデータファイルの作成
  • EC2インスタンスの作成、起動
  • IAMロール動作確認
  • 作成したリソースと変数の後片付け

構成

f:id:ooooouchi:20200704020856p:plain

ハンズオン(簡易版): IAM基礎(インスタンスプロファイル) — ハンズオン(簡易版): IAM基礎(インスタンスプロファイル) より抜粋

簡易手順

  1. ログの確認を実行するために必要なIAMポリシーを作成して
  2. インスタンスプロファイルを通してロールを適用する
  3. EC2インスタンスを作成してIAMロールをアタッチする
  4. 動作確認

詳細な手順は以下資料を参照してください。

prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com

理解したこと

IAMロールとは

  • AWSリソース同士を繋ぐもの
    • 呼び出す側(principal)と呼び出される側(API)の間に入って
    • 誰に何を許可、禁止するかを取りまとめる

インスタンスプロファイルとは

  • EC2とAWSリソースを繋ぐもの
    • principalがEC2の場合に使用する(ec2.amazonaws.com)

ハンズオンで学んだコマンド

信頼ポリシードキュメントの作成

cat << EOF > ${FILE_IAM_ROLE_DOC}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "${IAM_ROLE_PRINCIPAL}"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

信頼ポリシードキュメントを変数に格納しています。

IAMロール作成

aws iam create-role \
  --role-name ${IAM_ROLE_NAME} \
  --assume-role-policy-document file://${FILE_IAM_ROLE_DOC}

作成した信頼ポリシードキュメントの変数を参照する形でIAMロール作成コマンドを実行しています。

インスタンスプロファイルの作成

aws iam create-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}

インスタンスプロファイルにIAMロールをアタッチ

aws iam add-role-to-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
  --role-name ${IAM_ROLE_NAME}

この辺で「使用するパラメーターを変数として予め準備しておくと安全にコマンド実行できるなー」と思いながらハンズオンを進めていました。

IAMロールへのIAMポリシーアタッチ

aws iam attach-role-policy \
  --role-name ${IAM_ROLE_NAME} \
  --policy-arn ${IAM_POLICY_ARN}

実際は最後にログイベントの確認をするためのポリシーARN(arn:aws:iam::aws:policy/CloudWatchLogsFullAccess)を指定しています。

CloudFormationスタック作成

aws cloudformation create-stack \
  --stack-name ${CLOUDFORMATION_STACK_NAME} \
  --template-body file://${FILE_CLOUDFORMATION_TEMPLATE}

スタック作成のステータスも確認できるとのことでした。

CLOUDFORMATION_STACK_STATUS=$(\
  aws cloudformation list-stacks \
    --query "StackSummaries[? \
      StackName == \`${CLOUDFORMATION_STACK_NAME}\` \
        && StackStatus != \`DELETE_COMPLETE\` \
      ].StackStatus" \
    --output text \
) \
  && echo ${CLOUDFORMATION_STACK_STATUS}

EC2インスタンス作成

aws ec2 run-instances \
  --image-id ${EC2_IMAGE_ID} \
  --instance-type ${EC2_INSTANCE_TYPE} \
  --security-group-ids ${ARRAY_EC2_SECURITY_GROUP_IDS} \
  --tag-specifications ${STRING_TAG_CONF} \
  --subnet-id ${EC2_SUBNET_ID} \
  --user-data file://${FILE_USER_DATA} \
  --iam-instance-profile Name=${IAM_INSTANCE_PROFILE_NAME} \
  --associate-public-ip-address

実際のハンズオンではセキュリティグループのルールからユーザーデータなども含めて丁寧に解説されています。 中でもユーザーデータのbashは非常に参考になります。

EC2のパブリックIPアドレス取得

EC2_PUBLIC_IP=$( \
  aws ec2 describe-instances \
    --filters Name=tag-key,Values=Name \
              Name=tag-value,Values=${EC2_INSTANCE_TAG_NAME} \
    --instance-ids ${ARRAY_EC2_INSTANCE_IDS} \
    --query "Reservations[].Instances[].PublicIpAddress" \
    --output text \
) \
  && echo ${EC2_PUBLIC_IP}

接続確認

CURL_TARGET_URL="${EC2_PUBLIC_IP}" \
  && echo ${CURL_TARGET_URL}
curl -LI -Ss \
  -o /dev/null \
  -w '%{http_code}\n' \
  ${CURL_TARGET_URL}

HTTPステータスが返却されます。 正常に完了すると

200

が返却されます。 動作確認のcurlも普段CLIを使用しているからこその選択肢なんだな〜と思いながら進めてました。

CloudWatchログイベント取得

aws logs filter-log-events \
  --log-group-name ${LOGS_GROUP_NAME} \
  --max-items ${LOGS_EVENT_MAX_ITEMS}

前段でうまくIAMポリシーがインスタンスプロファイル付きのIAMロールにアタッチされていればログイベントが取得できます。

終わりに

記事中には記載していないですが、CloudFormationのテンプレートダウンロードやEC2作成中の進捗確認(html取得)にもcurlを使っています。

CLIに疎かったのでcurlは名前しか知らなかったのですが、便利すぎて感動しました:)

IAM部分ってマネージメントコンソールでわちゃわちゃやってみて「なんかできた」みたいなことが多かったですが、CLIでやってみるとどうやっても順序立てて実施する必要があるので論理的に理解が進みますね😌

JAWS-UG CLI専門支部の勉強会は週1〜2回の高頻度で開催されているので是非一緒に参加しましょう!