#
ドキュメント

Document

自分のための備忘録です。

ECSからの疎通確認

コンテナはDockerを使用することを想定しています。

内容

ECSと他サービスの疎通を確認するための覚書です。 ローカルとAWS ECSで確認することを想定しています。

  • ローカル DockerコンテナからAWSサービス(例:SQS)と疎通を確認
  • AWS ECSからAWSサービス(例:SQS)と疎通を確認

クレデンシャル

SDKはコードにクレデンシャルを明示しない場合は、以下順序でクレデンシャルを解決します。

  1. 環境変数
  2. クレデンシャルファイル/プロフィール
  3. IAMロールを使用(STS)

ローカルのDockerからの確認とAWS ECSからの確認でプログラムを変更したくないため、以下の方法でSDKにクレデンシャルを渡すことにします。

  • ローカルのDockerコンテナからAWSサービスと疎通を確認:環境変数を使用
  • AWS ECSからAWSサービスと疎通を確認:IAMロールを使用

↑を実現するために、AWS SDSのClient(例:SQS)にクレデンシャルを設定しません。

$client = new SqsClient([
    'region' => 'ap-northeast-1',
    'version' => '2012-11-05'
]);

以下のようにprofileなどを指定するとコンテナにクレデンシャルが必要になってしまいます。

$client = new SqsClient([
+    'profile' => 'default',
    'region' => 'ap-northeast-1',
    'version' => '2012-11-05'
]);

クレデンシャルを付与

ローカル

docker runeオプションを使ってクレデンシャルを環境変数で渡します。

# シェル変数にローカルの`default`のクレデンシャルを設定
AWS_REGION=$(aws configure get region)
AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

docker runeオプションで環境変数を渡します。

# -eでクレデンシャルを環境変数としてコンテナに渡す
$ docker run -e AWS_REGION=$AWS_REGION -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws-sqs-sample:latest

イメージaws-sqs-sample:latestが存在することを想定しています。

AWS ECS

AWS ECSでは、タスクロールに適切にIAMロールが設定していれば、IAMロールから一時的なクレデンシャルを取得して使用します。

具体的には読み・書き・削除が必要な場合はAmazonSQSFullAccessをアタッチしたロール

タスクロールにロール名TaskRoleを設定する前提で勧めます。 またTaskRoleはAssumeRolePolicyDocumentのPrincipalecs-tasks.amazonaws.com設定してあることを前提とします。

TaskRoleのPolicyにAmazonSQSFullAccessを追加します。 (ECSのログ管理でCloudWatchを使用する場合はCloudWatchFullAccessも追加します。)

IAM_Management_Console IAM_Management_Console
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}