コンテナはDockerを使用することを想定しています。
ECSと他サービスの疎通を確認するための覚書です。 ローカルとAWS ECSで確認することを想定しています。
SDKはコードにクレデンシャルを明示しない場合は、以下順序でクレデンシャルを解決します。
ローカルのDockerからの確認とAWS ECSからの確認でプログラムを変更したくないため、以下の方法でSDKにクレデンシャルを渡すことにします。
↑を実現するために、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 run
でe
オプションを使ってクレデンシャルを環境変数で渡します。
# シェル変数にローカルの`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 run
のe
オプションで環境変数を渡します。
# -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では、タスクロールに適切にIAMロールが設定していれば、IAMロールから一時的なクレデンシャルを取得して使用します。
具体的には読み・書き・削除が必要な場合はAmazonSQSFullAccess
をアタッチしたロール
タスクロールにロール名TaskRoleを設定する前提で勧めます。
またTaskRoleはAssumeRolePolicyDocumentのPrincipal
にecs-tasks.amazonaws.com
設定してあることを前提とします。
TaskRoleのPolicyにAmazonSQSFullAccessを追加します。 (ECSのログ管理でCloudWatchを使用する場合はCloudWatchFullAccessも追加します。)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}