はじめに
ECS ExecをするためにタスクIDを見にいくことからおさらばするための記事です📝
ECS execが可能になって、結構な月日がだったように思います。
今日は、ECSコンテナに一発で入るコマンドを紹介します。
まず結論
コマンド
aws ecs execute-command \
--region ap-northeast-1 \
--cluster cluster \
--task $(aws ecs list-tasks --cluster cluster | jq '.taskArns[0]' -r) \
--container web \
--interactive \
--command "/bin/bash"
※引数のcluster名、コンテナ名を指定してください。
解説
-
aws ecs list-tasks
でクラスターのタスクのARNを取得します。 - それ引数に渡して、
aws ecs execute-command
を実行しています。
準備(Macの場合)
1. jqコマンドをインストール
brew install jq
2. aws cliをインストール
sudo ln -s /folder/installed/aws-cli/aws /usr/local/bin/aws
sudo ln -s /folder/installed/aws-cli/aws_completer /usr/local/bin/aws_completer
3. Session Managerプラグインをインストール
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
ECSの構築
import { Aspects, aws_ecs, aws_ecs_patterns, aws_iam, IAspect, Stack, StackProps } from 'aws-cdk-lib';
import { Vpc } from 'aws-cdk-lib/aws-ec2';
import { CfnService } from 'aws-cdk-lib/aws-ecs';
import { Construct, IConstruct } from 'constructs';
class EnableExecuteCommand implements IAspect {
public visit(node: IConstruct): void {
if (node instanceof CfnService) {
node.addOverride('Properties.EnableExecuteCommand', true);
}
}
}
export class EcsExecDemoStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new Vpc(this, 'Vpc', {
cidr: '10.0.0.0/16',
});
const cluster = new aws_ecs.Cluster(this, 'cluster', {
vpc,
clusterName: 'cluster'
});
const loadBalancedFargateService = new aws_ecs_patterns.ApplicationLoadBalancedFargateService(
this,
'fargate',
{
cluster,
desiredCount: 1,
taskImageOptions: {
image: aws_ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'),
},
publicLoadBalancer: true,
}
)
// ECS execを有効化する
loadBalancedFargateService.taskDefinition.taskRole.addToPrincipalPolicy(
new aws_iam.PolicyStatement({
actions: [
'ssmmessages:CreateControlChannel',
'ssmmessages:CreateDataChannel',
'ssmmessages:OpenControlChannel',
'ssmmessages:OpenDataChannel',
],
resources: ['*'],
}),
);
Aspects.of(loadBalancedFargateService).add(new EnableExecuteCommand());
}
}
AWS CDK(TypeScript)で構築しています。
コマンド実行した時の挙動
上記のデプロイ完了後にコマンドを実行します。
$ aws ecs execute-command \
> --region ap-northeast-1 \
> --cluster cluster \
> --task $(aws ecs list-tasks --cluster cluster | jq '.taskArns[0]' -r) \
> --container web \
> --interactive \
> --command "/bin/bash"
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-061544f141048a53c
bash-4.2# ls
bin boot dev etc home lib lib64 local managed-agents media mnt opt proc root run sbin srv sys tmp usr var
無事、コンテナの中に入れました!!!
終わりに
皆さんの快適な開発ライフを心から願っています🙏