ちょっと話題の記事

[アップデート] AWS Cloud9 がまた少し便利になりました (CloudWatch Logs、S3、インスタンスプロファイル)

AWS Clou9 は IAM の権限まわりがややこしいですね

コンバンハ、千葉(幸)です。

AWS Cloud9 で新たな機能が使用できるようになりました。

3 つ……ないし 2 つの機能が増えています。(どちらなんだ。)

何ができるようになったか

冒頭のブログを確認すると、以下のように説明されています。

AWS Cloud9 introduces 3 new features, including support for CloudWatch Logs, S3 and EC2 instance profiles. Cloud9 users can now list their log groups and view log streams instantly without leaving their IDE. In addition, the S3 integration has improved performance in VPCs and now supports a new “Upload current file” feature. Finally, Cloud9 users using multi-factor authentication (MFA) and private VPCs can automatically authenticate via EC2 instance metadata and environment variable credentials sources.

機械翻訳結果は以下のとおり。

AWS Cloud9は、CloudWatch Logs、S3、EC2インスタンスプロファイルのサポートを含む3つの新機能を導入しています。Cloud9のユーザーは、IDEから離れることなく、ロググループを一覧したり、ログストリームを即座に確認できるようになりました。また、S3の統合によりVPCでのパフォーマンスが向上し、新たに「現在のファイルをアップロードする」機能をサポートしました。最後に、多要素認証(MFA)とプライベートVPCを使用するCloud9ユーザーは、EC2インスタンスのメタデータと環境変数の資格情報ソースを介して自動的に認証を行うことができます。

3つの機能として挙げられているのは以下です。

  • CloudWatch Logs のブラウズ
  • S3 バケットへのカレントファイルのアップロード
  • EC2 インスタンスプロファイルの使用?

このうち前者の2つは明確に内容を確認できたのですが、最後のインスタンスプロファイルについてはどうも確認できず……。AWS ドキュメントを上から下まで読んだり Cloud9 のコンソールを穴が開くほど見つめてみたのですが理解が追いつきませんでした。

ドキュメントヒストリーを見ても触れられていないので、もしかしたら以前からできたことなのかな?とも考えています。

Change Description Date
CloudWatch Logs and Amazon S3 in AWS Toolkit Added support for CloudWatch Logs to AWS Toolkit for AWS Cloud9. New feature to allow upload of current files to Amazon S3 buckets. July 16, 2021

恐らくこのことを指している……という内容で書いてみたので、正解をご存知の方は教えていただけると嬉しいです。

1. CloudWatch Logs のブラウズ

AWS Cloud9 上で使用できる AWS ToolKit の中で使用できるものです。

一部の AWS サービスは AWS Toolkit に対応しており、AWS Cloud9 の画面上で操作できるようになっています。今回のアップデートで CloudWatch Logs が対象に加わり、その内容を参照できるようになりました。

画面左から AWS Explorer を展開すると、CloudWatch Logs が追加されています。項目を展開すると、ロググループ一覧が確認できます。

AWS_Cloud9_cwlogs

ロググループを右クリックすると、「ログストリームの参照」か「 ARN のコピー」が選べます。

AWSCloud9_Logs

ログストリームの参照を選択すると、ロググループ内のストリームが一覧で表示されます。内容を確認したいログストリームを押下します。

AWSClou9_logstream

選択したログストリーム内のログイベントが IDE 画面に表示されます。画面上で新たなログイベントを読み込むことも可能です。

AWSClou9_Logevent

AWS Cloud9 上で Lambda を実行させ、その実行ログを IDE 上で確認する……ということもできそうですね。CloudWatch Logs のブラウズについて、詳細は以下を参照してください。

2. S3 へのカレントファイルのアップロード

AWS Cloud9 上でのカレントファイルをアップロードできるようになりました。Cloud9 環境上で作成したファイルを、 aws s3 コマンドなどを使用せずとも S3 にアップロードできます。

手順は簡単です。まずはアップロードしたいファイルを選択し、画面上部のコマンド入力画面にuploadと入力します。

AWSClou9Fiel

対応するコマンドの候補が出てくるため、AWS: Upload File...を選択します。

AWSCloud9_upload

ステップ 1 として、アップロードしたいファイルを選択します。

Step1

ステップ 2 としてアップロード先の S3 バケットを選択することでアップロードが始まります。

Step2

正常にアップロードが行われたことが IDE の画面で確認できます。

AWSClou9_upload

簡単でしたね。S3 へのアップロードの詳細は以下を参照してください。

3. インスタンスプロファイルの使用

明確に新機能かの自信がないので、関連しそうなところをおさらいしておきます。

AWS Cloud9 環境のタイプ

AWS Cloud9 環境のタイプは以下の種類があります。

  • EC2 環境(新規作成、直接接続)
  • EC2 環境(新規作成、Systems Manager 接続)
  • SSH 環境(既存の環境を使用、オンプレなど EC2 インスタンス以外でも可)

Systems Manager 経由の EC2 環境の場合、作成時に EC2 インスタンスにアタッチするインスタンスプロファイル(≒ IAM ロール)を指定することになります。

直接接続の EC2 環境であっても、作成後にインスタンスプロファイルをアタッチすることはできます。

AWS Cloud9 環境における IAM 権限の使用

AWS Cloud9 環境における IAM 認証は大まかに以下の三つのパターンに分かれます。

  • AWS Cloud9 に接続する IAM エンティティが持つ権限をベースとした AWS Managed Temporary Credentials(AMTC)を使用(EC2 環境でのデフォルト)
  • AWS Cloud9 環境の実体である EC2 インスタンスにアタッチされたインスタンスプロファイルを使用
  • 任意の IAM ユーザーが発行したアクセスキーを使用(非推奨)

EC2 環境において、デフォルトでは AMTC が使用されます。これは AWS Cloud9 環境に接続する IAM ユーザーや IAM ロールが持つ権限とほぼ同等のそれを持つ一時認証情報です。AWS が管理しており、定期的に情報が更新されます。

AMTC は IAM などの一部のサービスに対するアクションに制限があるほか、サービスエンドポイントに接続する送信元 IP アドレスが AWS Cloud9 環境の EC2 インスタンスのものでないといけない、という制約があります。(そのため AWS Cloud9 環境をプライベートサブネットに配置し NAT ゲートウェイ経由で AWS API を実行しようとするとほとんどの場合失敗する。)

そういった制約を避けるために、インスタンスプロファイルを使用することができます。AWS Cloud9 環境の実体である EC2 インスタンスに IAM ロール(インスタンスプロファイル)をアタッチし、その権限を使用するというものです。

やってみた

以下の条件で AWS Cloud9 環境を作成しました。

  • タイプは Systems Manager 接続の EC2 環境
  • プライベートサブネットに配置
    • NAT Gateway 経由でインターネット疎通可能
  • Amazon Linux2

AdministratorAccessの権限を持つ IAM ロールcm-chiba.yukihiroで環境に接続しましたが、AMTC を使用する場合にはほとんど AWS に対する操作を実行できません。

AWS CLI の実行

ターミナルからいくつか AWS CLI コマンドを実行しますがすべて失敗します。 *1

AWSCloud9_Error

cm-chiba.yukihiro:~/environment $ aws sts get-caller-identity 

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid
cm-chiba.yukihiro:~/environment $ aws ec2 describe-instances

An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
cm-chiba.yukihiro:~/environment $ aws rds describe-db-instances

An error occurred (InvalidClientTokenId) when calling the DescribeDBInstances operation: The security token included in the request is invalid
cm-chiba.yukihiro:~/environment $

右上の表示から、AMTC による制限を受けていることが見て取れます。

If you get an InvalidTokenId error and you are using AWS managed temporary credentials, your access might be restricted. For more information, see Temporary managed credentials.

AWS Explorer への接続

直接接続の EC2 環境の場合は自動的に表示されていた AWS Explorer が未接続の状態です。

AWSExplorer

接続を試みると、使用するプロファイルの選択肢が出てきます。まずはprofile:defaultを選択してみます。

SelectProfile

エラーが発生しました。

AWSCloud9_Error-8342910

Invalid Credentials profile:default, see logs for more information.

View Logs...を押下しましたが何も確認できませんでした。

AWS Explorer への接続(インスタンスプロファイルの使用)

続いてもう一つの選択肢であるec2:instanceのプロファイルを選択します。

AWS Explorer は表示されましたが、リソースの表示には失敗しています。

AWSClou9_Fail

Cloud9 環境で使用されている EC2 インスタンスにアタッチされているのは、自動的に設定されたAWSCloud9SSMAccessRoleという IAM ロールです。このロールにデフォルトでアタッチされている IAM ポリシーはAWSCloud9SSMInstanceProfileという名称で、Systems Manager 経由の接続に必要な最低限のものです。

AWSCloud9SSMInstanceProfile

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        }
    ]
}

AWSCloud9SSMAccessRoleに新たにAmazonS3FullAccessをアタッチしました。

S3FullAccess

Cloud9 の画面から Refresh Explorerを押下します。

RefreshExplorer

インスタンスプロファイルに権限をアタッチした S3 だけはリソースが参照できるようになりました。先ほど確認したカレントファイルのアップロードなども問題なく行えます。

AWSClou9_S3

AMTC の無効化

先ほど設定したプロファイルは PROJECT SETTINGSから確認できます。

AWSConfiguration

一方でターミナルで AWS CLI コマンドを叩くと引き続き AMTC が使用されています。

AWSCloud9-ERRor

AMTC の無効化をAWS SETTINGSから行います。トグルボタンで無効化します。

DisableAMTC

無効化後にターミナルから AWS CLI を実行すると、インスタンスプロファイルの権限が使用されていることが分かります。

AWSCloud9-CLI

cm-chiba.yukihiro:~/environment $ aws sts get-caller-identity 
{
    "Account": "000000000000", 
    "UserId": "AROAXXXXXXXXXXXXXXXXX:i-0fc40387fcfcf3f3c", 
    "Arn": "arn:aws:sts::000000000000:assumed-role/AWSCloud9SSMAccessRole/i-0fc40387fcfcf3f3c"
}
cm-chiba.yukihiro:~/environment $ aws ec2 describe-instances --region ap-northeast-1

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
cm-chiba.yukihiro:~/environment $

EC2 に関する権限をインスタンスプロファイルにアタッチしていないためにエラーが発生していますが、先ほどの AMTC を使用する際とはエラーの内容が異なります。必要に応じて権限を追加すれば困ることはなさそうです。

プライベートサブネットに配置した AWS Cloud9 環境であってもインスタンスプロファイルを使用して AWS に対する操作が実行できることが確認できました。

終わりに

AWS Cloud9 に関する新機能の確認でした。CloudWatch Logs、S3 に関する新機能は分かりやすく便利そうでいいですね。Cloud9 の IDE で作業している際にマネジメントコンソールと行ったり来たりする、という頻度が少なくなりそうです。

インスタンスプロファイルの使用についてはこれまでも AMTC を明示的に無効化すれば実現できました。(少なくとも直接接続の EC2 環境では。)

なので、プライベートサブネットに配置した環境でもできるようになった、なのか、ec2:instanceのような形式でプロファイルとして指定できるようになった、かが新機能なのかと捉えています。

(この辺りはちょっと自信がないので、補足・ツッコミ大歓迎です。)

ちょっとずつ便利になっていく AWS Cloud9 を利用して、よい開発ライフをお過ごしください。

以上、 チバユキ (@batchicchi) がお送りしました。

参考

脚注

  1. 話がややこしくなるのであえて取り上げるのを避けましたが、なぜか aws s3 コマンドは成功しました。ゲートウェイ型のVPC エンドポイントが関係しているのかと思い削除してから試行しましたが同様でした。わからん……また改めて確認します、、